考虑以下程序:
#include <iostream>
#include <string>
class B
{
public:
int n;
B() : n(0) {}
B(int m) : n(m) {}
};
class D1 : virtual public B
{
public:
int a;
D1() : a(0) {}
D1(int m) : a(m) {}
};
class D2 : public D1
{
public:
int d;
D2() : d(0) {}
D2(int m) : d(m) {}
D2(int j, int k) : d(j), D1(k) {}
D2(int i, int j, int k) : d(i), D1(j), B(k) {} //Without virtual inheritance,
//must add new constructor to D1.
};
int main()
{
std::string s;
D2 d2(0, 1, 2);
std::cout << "d2.n = " << d2.n << "\n";
std::cout << "d2.a = " << d2.a << "\n";
std::cout << "d2.d = " << d2.d << "\n";
std::cout << "Press ENTER to exit.\n";
getline(std::cin, s);
}让D1几乎从B继承允许我从D2的构造函数调用B的构造函数,跳过类D1。
除了钻石继承问题之外,这种虚拟继承的使用是否会导致未定义的行为或其他危害?
除了解决钻石继承问题,我从未见过使用虚拟继承的情况。
发布于 2021-01-30 04:45:31
除了钻石继承问题之外,这种虚拟继承的使用是否会导致未定义的行为或其他危害?
无论出于何种目的,虚拟继承都会招致这些“危害”:
对虚拟基类的
dynamic_cast完成。更快的static_cast是不可能的。您的示例没有引入任何未定义的行为或危害,这些行为或危害对于任何其他虚拟继承用法都是不存在的。
https://stackoverflow.com/questions/65961074
复制相似问题