父类构造函数不能实现多态
来源:互联网 发布:宁波软件开发 编辑:程序博客网 时间:2024/06/05 02:53
class AA
{
public:
AA(int a= 0)
{
this->a = a;
print(); //在构造函数里面能实现多态吗?
}
virtual void print()
{
cout<<"父类的"<<"a"<<a<<endl;
}
protected:
int a ;
};
class BB : public AA
{
public:
BB(int a= 0, int b = 0)
{
this->a = a;
this->b = b;
}
virtual void print()
{
cout<<"子类的"<<"a"<<a<<"b"<<b<<endl;
}
private:
int b ;
};
void howToPrintf(AA *pBase)
{
pBase->print();
{
BB b1;
howToPrintf(&b1);
{
public:
AA(int a= 0)
{
this->a = a;
print(); //在构造函数里面能实现多态吗?
}
virtual void print()
{
cout<<"父类的"<<"a"<<a<<endl;
}
protected:
int a ;
};
class BB : public AA
{
public:
BB(int a= 0, int b = 0)
{
this->a = a;
this->b = b;
}
virtual void print()
{
cout<<"子类的"<<"a"<<a<<"b"<<b<<endl;
}
private:
int b ;
};
void howToPrintf(AA *pBase)
{
pBase->print();
}
{
BB b1;
howToPrintf(&b1);
}
结果:输出"父类的a";而不是"子类ab".
解释:子类vptr指针的初始化过程是分步完成的。
1、当指向父类的构造函数的时候,如果你在父类的构造函数里面调用虚函数,C++编译会初始化子类的vptr指针,让vptr指针指向父类的虚函数表;
2、当父类的构造函数执行完毕后,再执行子类的构造函数,这个时候,让vptr指针真正的指向子类的虚函数表。
总结:
(1)对象在创建的时,由编译器对VPTR指针进行初始化
(2)只有当对象的构造完全结束后VPTR的指向才最终确定
(3)父类对象的VPTR指向父类虚函数表
(4)子类对象的VPTR指向子类虚函数表
阅读全文
0 0
- 父类构造函数不能实现多态
- JAVA 子类不能继承父类的构造函数
- 构造函数中无法实现多态
- 构造函数中无法实现多态
- 在父类的构造函数和析构函数中都不能调用纯虚函数
- 在父类的构造函数和析构函数中都不能调用纯虚函数
- 构造函数不能调用构造函数
- 构造函数中调用虚函数能否实现多态
- 构造函数不能被继承
- goto 不能跳过构造函数
- 构造函数不能被继承
- goto 不能跳过构造函数
- 父类的构造函数中不能调用纯虚函数,同样在析构函数中不能调用纯虚函数
- WebService 类中构造函数不能重载为带参数
- 抽象类中为什么不能有构造函数?
- 使用mybatis,Bean类不能缺少默认构造函数
- 多态不能发生在父类的构造方法中
- c++构造函数中无法实现多态
- Python中Numpy矩阵的使用
- 51nod 1572 宝岛地图
- python encode和decode函数说明
- 5月英语总结
- 51nod 1875 丢手绢
- 父类构造函数不能实现多态
- 详解Oracle的unlimited tablespace系统权限
- 机房收费系统之十一(优化)
- 梯度下降算法及python实现(学习笔记)
- Windows7+Anaconda3+Tensorflow
- 文件操作
- 知乎全网最高赞:人生最重要的三种能力,不是读书能学来的
- Kotlin笔记(九)异常
- [leetcode]154. Find Minimum in Rotated Sorted Array II