c++ - 将派生自基类的类的实例传递给函数

标签 c++ class inheritance abstract-class

我的 C++ 程序中有一个类层次结构:

class DEBase {
public:
    virtual double distance(vec3) = 0;
};

class Sphere : public DEBase {
private: ...
public:
    Sphere(...) {...}
    ...
    double distance(vec3 p) {...}
};

class XZPlane : public DEBase { 
... 
public: 
    XZPlane(...) {...} 
    ... 
    double distance(vec3 p) {...} 
} 
...

我想将派生自 DEBase 的任何对象传递给函数。

void addObject(DEBase o) {
    someVector.push_back(o);
}

但是,这不起作用。我收到一条错误消息说 error: cannot declare parameter 'o' to be of abstract type 'DEBase'

当我用 Google 搜索了一下时,我发现您可以通过引用传递对象。

void addObject(DEBase &o) {
    someVector.push_back(&o);
}

该函数现在可以正确编译,但是调用它似乎是不可能的。 我尝试了 addObject(new Sphere(...)),我尝试了 addObject(&new Sphere(...)),但是,没有任何效果。

我怎样才能让它发挥作用?

最佳答案

(我已经在两个小时前在聊天中回答了这个问题。这是我所说的。)

这完全取决于。这不是关于多态性的问题;这是一个关于对象所有权以及您打算如何构建对象的问题。

现在你最大的问题是你试图传递一个指针(或者,在你荒谬的后一个例子中,一个指向指针的指针!)当函数不期望一个。请记住,引用不是指针。

似乎接受指向该函数的指针会更有意义。考虑使它成为某种 C++11 智能指针。

但是,同样,这与继承或多态性完全无关(除了使用它会阻止您按值获取新对象这一事实)。

关于c++ - 将派生自基类的类的实例传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28140359/

相关文章:

c++ - extern const char* const SOME_CONSTANT 给我链接器错误

c++ - 是否有术语表(甚至更好的插件)来显示函数定义而不必在文件之间跳转?

c++ - 我应该扩展 QT 小部件还是使用我自己的包含小部件的类作为成员?

javascript,仅在满足特定条件时才更改类

php - PHP 中的继承——创建子实例并调用父方法

java - 对 Liskov 替换原则的合规性进行单元测试是一种好的做法吗?

c++ - Qt 5 QWebEngine页面printToPdf C2668对重载函数的不明确调用

c++为什么这个错误 "basic_string::substr"并打破循环

C++函数回调

Typescript 子类继承的方法允许参数中未定义的键