gpt4 book ai didi

c++ - 范围界定是访问虚拟功能的合法方式吗?

转载 作者:太空狗 更新时间:2023-10-29 20:20:47 25 4
gpt4 key购买 nike

我有一个包含 4 个类的 C++ 程序:Person、Student、Employee 和 PartTimeStudent。

Student 和 Employee 均派生自 Person,而 PartTimeStudent 派生自所有 3 个类(使其成为最派生的类)。所有类都有一个名为 VDescribe() 的虚函数。

请看下面的代码:

class Person
{
...
virtual void VDescribe();
...
};

class Student : virtual public Person
{
...
virtual void VDescribe();
...
};

class Employee : virtual public Person
{
...
virtual void VDescribe();
...
};

class PartTimeStudent : virtual public Person,
virtual public Student,
virtual public Employee
{
...
virtual void VDescribe();
...
};

注意:在上面的代码片段中,我省略了构造函数、析构函数和成员变量,因为它们与问题无关。

此外,我有以下代码,其中创建了一个 PartTimeStudent 对象并通过指针访问。我使用范围来调用 PartTimeStudent 对象中不同子对象的 VDescribe() 函数。

void DoTest()
{
PartTimeStudent* pPTS = new PartTimeStudent("John", 23, "NTU", "Seven-Eleven");

pPTS->VDescribe();
pPTS->::Person::VDescribe();
pPTS->::Student::VDescribe();
pPTS->::Employee::VDescribe();
}

代码编译成功,我可以调用不同版本的 VDescribe()。我想知道的是,这是访问虚函数的合法方式吗?这是可以接受还是不鼓励的做法?

最佳答案

是的,这是一种绕过动态调度并调用特定版本的虚函数而不是其最终覆盖程序的完全合法的方法。

但是,我通常会觉得在类的外部看到这样的代码很奇怪,我会检查是否存在设计问题或误解。通常,此类代码类本身中用于调用函数的覆盖版本(通常来自覆盖程序)。

关于c++ - 范围界定是访问虚拟功能的合法方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48223509/

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