虚继承&多态

虚继承和路径二义性:

当派生类从多个基类派生,而这些基类又从同一个基类派生,则在派生类中访问此共同基类中的成员时,将产生另一种访问不确定性 ——路径二义性
解决方式:虚继承

class B1  { //基类B1
public:
    B1(int i=12):m_b(i){cout<<"constructing B1 "<<i<<endl;} //有参构造函数
protected:
    int m_b;
};
class B2:virtual public B1  {   //基类B2
public:
    B2(int j):B1(j) {cout<<"constructing B2 "<<j<<endl;} //有参构造函数
};
class B3:virtual public B1  {   //基类B3
public:
    B3(int j):B1(j){cout<<"constructing B3 *"<<endl;} //无参构造函数
};
class C: public B2,public B3   {
public:
    C(int b,int d):B2(b),x(d),B3(d)
    {
        cout<<"constructing C "<<endl;
    }
    void output(){
        cout<<m_b<<endl;
    }

private:    
       int  x;
};
int main()
{
    C obj(5,6);
    obj.output();//祖父类必须定义无参数的构造函数。
    return 0;
}
多态概念的引出
虚函数--多态实现的条件

1、共有继承
2、虚函数重写
3、父类的指针指向子类对象,或者子类对象初始化父类对象。

问题:

谈谈C++编译器是如何实现多态
谈谈你对重写,重载理解
是否可将类的每个成员函数都声明为虚函数,为什么。
--通过指针VFPTR调用重写函数是在程序运行时进行的,因此需要通过寻址操作才能确定真正应该调用的函数。而普通成员函数是在编译时就确定了调用的函数。在效率上,虚函数的效率要低很多。
因此,没有必要将所有成员函数都声明为虚函数。

构造函数中调用虚函数能实现多态吗 ?为什么?
--不能,对象在创建的时,由编译器对VPTR指针进行初始化
只有当对象的构造完全结束后VPTR的指向才最终确定 ,另外,能实现指针或引用调用吗?

虚函数表指针(VPTR)被编译器初始化的过程,你是如何理解的?
为什么要定义虚析构函数?

纯虚函数和抽象类
练习:
编写一个C++程序, 计算程序员( programmer )工资
1 要求能计算出初级程序员( junior_programmer ) 中级程序员 ( mid_programmer )高级程序员( adv_programmer)的工资
2 要求利用抽象类统一界面,方便程序的扩展, 比如:新增, 计算 架构师 (architect ) 的工资

动态类型转换
const_cast< >
static_cast< >
reinterpret_cast< >
dynamic_cast< >

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • C++虚函数 C++虚函数是多态性实现的重要方式,当某个虚函数通过指针或者引用调用时,编译器产生的代码直到运行时才...
    小白将阅读 5,683评论 4 19
  • C++很重要的一个特征就是代码重用。在C语言中重用代码的方式就是拷贝、修改代码。C++可以用继承或组合的方式来重用...
    漫游之光阅读 2,823评论 0 0
  • 华灯初照人 暮色已三分 心是玲珑镜 人如海底针 泥牛自沉海 青鸟空殷勤 惶惶无终日 离离草木深 何苦复来去 乱我青衣襟
    刘姑娘和李小姐阅读 1,607评论 1 4
  • 初见,见与不见;再见,念与不念;再再见,动与不动;再再再见,认与不认;再再再再见,识与不识;再再再再再见,知与不知...
    给凌秋莹的信阅读 3,047评论 1 1
  • 确实是,当我做一件自己无法完成的事情时,我会觉得烦,而影响自己的事情,专注于自己的弱点。我们是应该把专注点放到强项...
    一只永不止步的龙阅读 1,373评论 0 2

友情链接更多精彩内容