c ++是从特定类派生的类吗?

时间:2013-03-30 18:22:38

标签: c++ derived

我有可能实现的目标。这就是问题所在:

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类型,但实际上可能是content1content2类型,所以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;
}

4 个答案:

答案 0 :(得分:2)

如果您的类型是多态的(即如果它们至少有一个virtual函数),则可以使用dynamic_cast<>dynamic_cast<>的结果将是一个空指针(即C ++ 11的nullptr,C ++ 03的NULL)如果指向的对象实际上不是指定的实例类或其派生类:

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() { }
//  ^^^^^^^
};

答案 1 :(得分:1)

是的,请使用dynamic_cast - http://www.cplusplus.com/doc/tutorial/typecasting/

它将为您提供RTTI - 运行时类型信息。

Content1 * p = dynamic_cast<Content1 *>(c);

如果p为非NULL,则c指向Content1或从Content1派生的对象。 但是,你的类层次需要是多态的。由于您的类Content是抽象的(我假设您在内容中有一个纯虚函数),因此您的整个层次结构自动是多态的。

答案 2 :(得分:1)

如果您必须知道多态类的确切运行时类型,则应重新考虑您的设计。通常最好是将不同类型的对象保存在不同的容器中(另外或者,而不是一个中央容器),或者为每个派生类添加一个虚函数,执行必须区分类型的操作。 / p>

C ++常见问题解答中有一个条目可能会对您有所帮助:I have a heterogeneous list of objects, and my code needs to do class-specific things to the objects. Seems like this ought to use dynamic binding but can't figure it out. What should I do?

答案 3 :(得分:0)

如果您想查看Content*是否指向从Content2类派生的类的对象,只需将其转换为dynamic_cast并查看。

这有效:

#include <iostream>
#include <typeinfo>

using namespace std;

class Content{public: virtual ~Content(){}};

class Content1 : public Content{public: virtual ~Content1(){}};
class Content1_1 : public Content1{public: virtual ~Content1_1(){}};
class Content1_2 : public Content1{public: virtual ~Content1_2(){}};

class Content2 : public Content{public: virtual ~Content2(){}};
class Content2_1 : public Content2{public: virtual ~Content2_1(){}};
class Content2_2 : public Content2{public: virtual ~Content2_2(){}};

class Container{
public:
    Content* c;
};

int main()
{
    Content* cnt=new Content2_1;
    if(dynamic_cast<Content2_1*>(cnt))
        cout << "True" << endl;
    return 0;
}