c++ - C++中虚类和extern的使用

标签 c++ class virtual extern

当我还是一名学生时,我已经使用 C++ 进行了一段时间的开发,但我从未在任何项目中使用 C++ 中的虚拟类或外部。我最近才读到这两个,希望有人能更好地了解它们的用法。

虚拟类的目的是什么?可以在哪里使用/实现它的示例。我在 IBM 网站上对它进行了一些掩饰,并编写了一个测试程序来查看它的运行情况,但是什么时候使用虚拟类比较好?

extern 也是如此。我看到了一个例子,并用 C++ 为自己做了一个测试,但是使用 extern 而不是使用头文件的优势是什么?头文件而不是 extern 的优势是什么?

最佳答案

虚拟类适用于遇到 dreaded diamond 时.例如:

struct Base { int x; };
struct D1 : Base {};
struct D2 : Base {};
struct Derived : D1, D2 {};

这里,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 !

虚拟继承通过使 DerivedBase 派生仅 一次 解决了这个问题。

struct Base { int x; };
struct D1 : virtual Base {};
struct D2 : virtual Base {};
struct Derived : D1, D2 {};

这里,Derived只有一个Base部分,和一个名为x的成员变量。

关于c++ - C++中虚类和extern的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4189667/

相关文章:

c++ - 在套接字关闭之前不发送数据

c++ - 使用 std::function 的隐式转换

c# - 编译为空的虚拟 IEnumerable<T>

c++ - operator<< 内部的虚方法调用

c++ - Qmake 创建 .pc 文件

c++ - 在 C++ 中对某些序列化进行原型(prototype)化的快捷方式?

Java类变量个数

C++ 基本类构造函数

.net - 在Powershell中动态检索类信息

C++ "virtual"关键字放置