我想要实现的目标是否可能?这就是问题所在:
class Content{};
class Content1 : public Content{};
class Content1_1 : public Content1{};
class Content1_2 : public Content1{};
class Content2 : public Content{};
class Content2_1 : public Content2{};
class Content2_2 : public Content2{};
class Container{
public:
Content* c;
};
是否可以确定Container
类的指针是否指向Content1
的对象或从Content1
派生的类的对象>?
谢谢。
编辑:
如果我在 container
类中查找指针的类型,它会被视为 content
类型,尽管它实际上可能是 content1
或 content2
类型,因此dynamic_cast 不起作用。
class content{};
class content1 : public content{};
class content2 : public content{};
class container{
public:
content* c;
};
int main(void)
{
container* x = new container;
x->c = new content2;
if( dynamic_cast<content1*>((content1*)x->c) == NULL){
//This doesn't fail, eventhough 'content1' and 'content2' shouldn't be compatible.
//This means that every class, derived from 'content' will be treated as 'content1' when using dynamic_cast.
}
return 0;
}
最佳答案
如果您的类型是多态的(即,如果它们至少有一个 virtual
函数),则可以使用 dynamic_cast<>
。 dynamic_cast<>
的结果如果指向的对象实际上不是指定类或其派生类的实例,则将为空指针(即 nullptr
对于 C++11,NULL
对于 C++03):
Container cont;
Content1* pContent1 = dynamic_cast<Content1*>(cont.c);
if (pContent1 != nullptr)
{
// cont.c points to an instance of Content1
// or a class derived from Content1
}
常见的做法是将基类的析构函数设为虚拟,以便从基类派生的类的对象可以是 delete
d 通过基类指针(如果析构函数不是 virtual
,尝试这样做会导致未定义的行为):
class Content //Abstract.
{
public:
virtual ~Content() { }
// ^^^^^^^
};
关于c++ 类是从特定类派生的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15721893/