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

标签 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;
}

最佳答案

如果您的类型是多态的(即,如果它们至少有一个 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/

相关文章:

c++ - 将 "std::vector<unsigned char>"的内容保存到文件中

c++ - 在指针转换期间初始化?

c++ - 在 C++ 中的非默认参数之间创建具有默认参数的函数

c++ - 从模板派生类转换为模板基类

json - Circe DeriveDecoder/deriveEncoder 找不到 io.circe.generic.encoding.DerivedAsObjectEncoder 类型的惰性隐式值

c# - 在 C# 中使用派生返回类型覆盖抽象属性

python - 如何从派生类打印变量?

c++ - 在多个函数中使用时 va_list 的意外行为

c++ - 当我尝试释放指针 vector 时出现问题

c++ - 为什么未分配的内存标记为 0xCC?