【面向对象程序设计常见面试题】虚基类的几点说明(xx)

1、如果虚基类中定义有带形参的构造函数,并且没有定义默认形式的构造函数,则整个继承结构,所有直接或间接

派生类都必须在构造函数的成员初始化列表中列出对虚基类构造函数的调用,以初始化在虚基类中定义的数据成员


2、建立一个对象时,如果这个对象中含有从虚基类继承的成员,则虚基类的成员是由最远派生类的构造函数通过调

虚基类的构造函数进行初始化的。该派生类的其他基类对虚基类构造函数的调用可以自动忽略


3、如果同一层次中同时包含虚基类和非虚基类,应该先调用虚基类的构造函数,再调用非虚基类的构造函数,最后

用派生类的构造函数

class X:public Y,virtual public z{
};
X one


4、对于多个虚基类,构造函数的执行顺序是先左后右,自上而下

5、对于非虚基类,构造函数的执行顺序是先左后右,自上而下

6、如果虚基类由非虚基类派生,则仍然先调用基类构造函数,再调用派生类的构造函数


#include <iostream>
using namespace std;

class Base
{
public:
    Base(int sa){
        a = sa;
        cout<<"Base"<<endl;
    }
protected:
    int a;

};
class Base1:virtual public Base
{
public:
    Base1(int sa,int sb):Base(sa)
    {
        b = sb;
        cout<<"Base1"<<endl;
    }
private:
    int b;

};
class Base2: virtual public Base
{
public:
    Base2(int sa ,int sc):Base(sa)
    {
       c = sc;
        cout<<"Base2"<<endl;
    }
private:
    int c;

};
class Derived:public Base1,public Base2
{
public:
    Derived(int sa,int sb,int sc,int sd):Base(sa),Base1(sa,sb),Base2(sa,sc){
        d = d;
        cout<<"Derived"<<endl;
    }
private:
    int d;

};

int main(){
    Derived obj(2,4,6,8);
    return 0;

}

Base的构造函数只执行一次,当类Derived的构造函数调用虚基类Base的构造函数之后,类Base1和类Base2对类

Base的构造函数的调用被忽略。这是初始化虚基类和初始化非虚基类的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值