gpt4 book ai didi

c++ - 从两个多态类继承

转载 作者:搜寻专家 更新时间:2023-10-31 00:48:56 24 4
gpt4 key购买 nike

给定以下代码

class T {
public:
virtual ~T () {}
virtual void foo () = 0;
};

class U {
public:
U() {}
~U() {}
void bar () { std::cout << "bar" << std::endl; }
};

class A : public U, public T {
public:
void foo () { std::cout << "foo" << std::endl; }
};

int main () {
A * a = new A;

std::vector<U*> u;
std::vector<T*> t;

u.push_back(a);

t.push_back(reinterpret_cast<T*>(u[0]));

u[0]->bar ();
t[0]->foo ();

delete a;
return 0;
}

我得到了我期望的输出

bar
foo

但是,如果我将 U 的定义更改为

class U {
public:
U() {}
virtual ~U() {}
virtual void bar () { std::cout << "bar" << std::endl; }
};

我仍然可以正常编译并且没有警告/错误,但现在输出是

bar
bar

阻止我调用 foo 的虚拟声明是什么?

最佳答案

首先,您的示例中没有虚拟基类。包含虚函数的类称为多态。 (C++ 中有“虚拟基类”之类的东西,但它与您的示例无关。)

其次,代码的行为不依赖于任何虚拟声明。您使用 reinterpret_cast 故意破坏了基指针的完整性。因此,代码的行为未定义

从一个基指针到另一个基指针的直接转换(这是您在代码中尝试执行的操作)称为交叉转换。 C++ 中唯一可以执行交叉转换的转换是 dynamic_cast

t.push_back(dynamic_cast<T *>(u[0])); 

您可以在没有dynamic_cast 的情况下执行间接交叉转换,但为此您必须首先使用 向下转换指向派生类型的指针(A *) static_cast 然后将其上转换为另一种基本指针类型

t.push_back(static_cast<A *>(u[0])); // upconversion to `T *` is implicit

关于c++ - 从两个多态类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2158928/

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