在C++中使用虚拟类和extern

shi*_*aki 4 c++ virtual class extern

当我还是学生的时候,我一直在用C++开发一段时间,但我从来没有在任何项目中使用C++中的虚拟类或extern.我刚刚读到了这两个,并希望有人能更好地理解它们的用法.

虚拟课的目的是什么?可以使用/实现的示例.我在IBM网站上稍微掩饰了一下并编写了一个测试程序来看它的实际运行情况,但什么时候使用虚拟类会很好?

外部也是如此.我看了一个例子,并在C++中为自己做了一个测试,但是使用extern而不是使用头文件有什么好处?头文件而不是extern的优点是什么?

Pet*_*der 7

虚拟课程适合您遇到可怕的钻石.例如:

struct Base { int x; };
struct D1 : Base {};
struct D2 : Base {};
struct Derived : D1, D2 {};
Run Code Online (Sandbox Code Playgroud)

这里,Derived实际上有两个 Base部分,因此调用了两个成员变量x.它将进行编译,但在Derived通过其基类操作对象时可能会遇到一些意外行为.

Derived derived;
D1& d1 = derived;
D2& d2 = derived;
d1.x = 1;
d2.x = 2;
cout << d1.x << d2.x << endl; // 12 !
Run Code Online (Sandbox Code Playgroud)

虚拟继承只通过一次Derived派生来解决这个问题.Base

struct Base { int x; };
struct D1 : virtual Base {};
struct D2 : virtual Base {};
struct Derived : D1, D2 {};
Run Code Online (Sandbox Code Playgroud)

这里Derived只有一个Base部分,一个成员变量被调用x.