gpt4 book ai didi

c++ - dynamic_cast 中的模糊转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:12:11 26 4
gpt4 key购买 nike

考虑获取对象作为参数并打印其类型的问题:

#include <iostream>

class A { };
class B : public A { };
class C : public A { };
class D : public C, public B { };

using namespace std;

template<class T>
void print_type(T* info)
{
if(dynamic_cast<D*>(info))
cout << "D" << endl;
else if(dynamic_cast<C*> (info))
cout << "C" << endl;
else if(dynamic_cast<B*>(info))
cout << "B" << endl;
else if(dynamic_cast<A*> (info))
cout << "A" << endl;
}

int main(int argc, char** argv)
{
D d;
print_type(&d);
return 0;
}

它给我以下错误:“从派生类‘D’到基类的转换不明确。”
但是我没看出歧义在哪里:如果main(d)中声明的对象是D类型,为什么不能直接转换为A类型呢?

此外,如果我传递一个字符串类型的参数,我当然会得到其他错误:
'std::basic_string<char>' is not polymorphic

在 Java 中,泛型的语法是:<T extends A> ;在这种情况下,它会很有用。我如何使用模板在 C++ 中制作类似的东西?


我这样修改了代码:

#include <iostream>
#include <vector>

class A { };
class B : virtual public A { };
class C : virtual public A { };
class D : public C, public B { };

using namespace std;

template<class T>
void print_type(T* info)
{
if(dynamic_cast<D*>(info))
cout << "D" << endl;
else if(dynamic_cast<C*> (info))
cout << "C" << endl;
else if(dynamic_cast<B*>(info))
cout << "B" << endl;
else if(dynamic_cast<A*> (info))
cout << "A" << endl;
}

int main(int argc, char** argv)
{
string str;
print_type(&str);
return 0;
}

但我仍然收到错误: 'std::basic_string<char>' is not polymorphic

最佳答案

首先,这不是模板问题。如果您删除模板并让 print_type 接受 D*,您会发现错误仍然存​​在。

发生的事情是您使用虚拟继承,因此您会遇到这种情况:

A   A
| |
B C
\ /
D

dynamic_cast 不知道您指的是哪个A

要实现这一点:(我认为这就是您想要的)

  A
/ \
B C
\ /
D

...你应该使用 virtual inheritance ,因此:

class A
{
};

class B : virtual public A
{
};

class C : virtual public A
{
};

class D : public C,public B
{
};

...现在它编译没有问题了:)(尽管记住虚拟继承是邪恶的)

关于c++ - dynamic_cast 中的模糊转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10037295/

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