gpt4 book ai didi

c++ - 不要为虚拟基类使用默认构造函数

转载 作者:行者123 更新时间:2023-11-28 05:34:02 26 4
gpt4 key购买 nike

我在看 Understanding virtual base classes and constructor calls而且我知道最派生的类将直接调用顶级基类的默认构造函数。但是有没有办法不调用 top-base 默认构造函数?

我的问题的一个例子,

#include <iostream>
#include <cstdint>

////// BEGIN LIBRARY CODE
class A
{
public:
A()
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}

A(int)
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}
};

class B : virtual public A
{
public:
B()
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}
};

class C: virtual public A
{
public:
C()
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}
};

class D: public B, public C
{
public:
D(int x) : A(x), B(), C() // ok. works as expected
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}
};
////// END LIBRARY CODE


////// USER CODE BEGINS

class E: public D
{
public:
E() : D(42) // problem, invokes A(), not A(int)
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}

E(int x) : D(x) // same problem
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}
};
////// USER CODE ENDS

int main()
{
D d(1);
E e1,e2(42);
}

输出

A::A(int)
B::B()
C::C()
D::D(int)
A::A()
B::B()
C::C()
D::D(int)
E::E()
A::A()
B::B()
C::C()
D::D(int)
E::E(int)

问题:

我希望E 只关心D 构造。但是从一开始的解释来看,如果我不在下面添加A::A(int),那么无论我如何更新类D,我将始终使用默认构造函数

E() : A(42), D(42) // works, but undesirable
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}

E(int x) : A(x), D(x) // this works, but undesirable
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}

简而言之,我不希望扩展库代码 class D 的用户代码 class E 必须指定 class A施工参数so...

  • 有没有什么方法可以通过继承链中的“中间”类(如我上面示例中的类 D)来完成,以减轻最派生的类必须这样做的负担?

最佳答案

顶级类的构造函数调用所有虚基类的构造函数。但这与为直接非虚基类调用构造函数没有什么不同:如果你进行显式构造函数调用,编译器将使用它;如果不这样做,它将使用默认构造函数。所以答案是否定的,如果默认构造函数不合适,你无法避免从 E 调用 A 的构造函数。

关于c++ - 不要为虚拟基类使用默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38748654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com