gpt4 book ai didi

c++ - 虚拟继承 - 与其他派生类共享的基础

转载 作者:行者123 更新时间:2023-11-28 00:59:57 25 4
gpt4 key购买 nike

Bjarne Stroustrup 写道:

When defining the functions for a class with a virtual base, the programmer in general cannot know whether the base will be shared with other derived classes. This can be a problem when implementing a service that requires a base class function to be called exactly once.

我不明白这个说法。可能会出现哪些问题?

为了解释它,他举了一个奇怪的例子

class A {                             // no constructor
// ...
};
class B {
public:
B(); // default constructor
// ...
};
class C {
public:
C(int); // no default constructor
};
class D: virtual public A, virtual public B, virtual public C
{
D() { /*... */ } // error: no default constructor for C
D(int i) : C(i i) { /*... */ }; // ok
// ...
};

它在这里相关吗??

最佳答案

假设您有一个虚拟基类,需要通过调用 .initialize(42) 来初始化,恰好一次。关键是,您不知道应该由哪个派生类调用它。

struct X : virtual A {
X() {
// here
}
};

struct Y : virtual A {
Y() {
// or here
}
};

struct Z : X, Y {
// what about this
};

这种情况下的正确答案是“有时在这里,有时在那里”,但您不知道是哪种情况(取决于哪个类是最派生的子对象)。

C++ 为构造函数解决了这个问题,st.所有虚拟基础的构造函数在最派生的子对象的构造函数中只被调用一次;层次结构中的任何构造函数都必须准备好调用虚拟基础构造函数(尽管在运行时,它可能不会发生)。

关于c++ - 虚拟继承 - 与其他派生类共享的基础,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9241499/

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