C++继承与多态

标签 c++ pointers inheritance polymorphism

作为一名 Java 程序员和一名 C++ 菜鸟,我在处理 C++ 中的继承方面遇到了困难。现在,我有这个:

class Parent {
public:
    Parent() {}
    virtual std::string overrideThis() { }
};

class Child : public Parent {
public:
    std::string attribute;
    Child(const std::string& attribute) : attribute(attribute) { }
    std::string overrideThis(){
    std::cout << "I'm in the child" << std::endl;
    return attribute.substr(1, attribute.size()-2);
    }
};

这个片段在其他地方:

Child *child = new Child(value);
Child childObject = *(child);
std::cout << "I'm trying this: " << childObject.overrideThis() << endl;

上面的代码按预期工作,消息打印在屏幕上。但是,如果不是这样,我试试这个:

Child *child = new Child(value);
Parent childObject = *(child);
std::cout << "I'm trying this: " << childObject.overrideThis() << endl;

我有一个有趣的运行时错误,屏幕上有很多有趣的字符。使用指针的多态性的正确方法是什么?我要做的是在 Child 实例上调用 overrideThis()

最佳答案

程序有未定义的行为,因为被调用的函数 -Parent::overrideThis 没有返回,尽管它应该返回。

调用 Parent 类中的函数是因为 Parent childObject = *(child); 切片 您尝试复制的对象 -新对象 childObjectParent 类型,而不是 Child

要使多态性起作用,您需要使用指针或引用:

Parent* childObject1 = child;
Parent& childObject2 = *child;
childObject1->overrideThis();
childObject2.overrideThis();

关于C++继承与多态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17500131/

相关文章:

c++ - 从 void* 到 DWORD 的指针截断

C++ 通过类指向字符串的指针

sql - 在 PostgreSQL 中不可能在两个兄弟表之间映射表?

.net - 在 .net 中强制继承

c++ - 如何获取我当前正在使用 Clang 访问的文件的名称?

c++ - 结构变量包含什么?

c++ - 指针 vector 的 Push_back 方法导致 C++ 崩溃

c - (int*) &var 是什么意思?

ios - objective-c : how to inherit category methods loaded in a parent class?

c++ - snprintf 是否可能返回以 '\0' 开头的字符数组?