c – 构造函数调用层次结构

前端之家收集整理的这篇文章主要介绍了c – 构造函数调用层次结构前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在类型层次结构中调用构造函数的规则时遇到了棘手的问题.这是我做的:
class A{
protected:
    int _i;
public:
    A(){i = 0;}
    A(int i) : _i(i){}
    virtual ~A(){}
    virtual void print(){std::cout<<i<<std::endl;}
};

class B : virtual public A{
protected:
    int _j;
public:
    B() : A(){_j = 0;}
    B(int i,int j) : A(i),_j(j){}
    virtual ~B(){}
    virtual void print(){std::cout<<i<<","<<j<<std::endl;}
};

class C : virtual public B{
protected:
    int _k;
public:
    C() : B(){_k = 0;}
    C(int i,int j,int k} : B(i,j),_k(k){}
    virtual ~C(){}
    virtual void print(){std::cout<<i<<","<<j<<","<<k<<std::endl;}
};

int main(){
    C* myC = new C(1,2,3);
    myC->print();
    delete myC;
    return 0;
}

现在,我想让新的C(1,3)调用B(1,2)的构造函数,然后调用构造函数A(1)来存储_i = 1,_j = 2,_k = 3.在创建类C的实例myC时,出于某种原因我不明白,但是,要调用的第一个构造函数是A的标准构造函数,即A :: A();这显然会导致错误的结果,因为受保护的变量_i被赋值为0.从不调用构造函数A(1).为什么会这样?我发现这非常直观.有没有办法避免显式调用类型层次结构中的所有构造函数来实现所需的行为?

谢谢你的帮助!

解决方法

使用虚拟继承时,派生程度最高的类必须直接调用其所有虚拟基础的构造函数.在这种情况下,C的构造函数必须为B和A调用构造函数.由于您只调用B构造函数,因此它使用默认的A构造函数. B构造函数调用另一个构造函数并不重要:因为它是一个虚拟基类,所以忽略此调用.

您有两种解决此问题的方法:显式调用A(int)构造函数

C(int i,int k} : A (i),B(i,_k(k){}

或使用普通继承而不是虚拟.

原文链接:https://www.f2er.com/c/117730.html

猜你在找的C&C++相关文章