将从基类派生的类的实例传递给函数

时间:2015-01-25 19:13:28

标签: 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(...)),然而,没有任何作用。

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

3 个答案:

答案 0 :(得分:2)

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

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

现在你最大的问题是你正在尝试传递一个指针(或者,在你的无意义的后一个例子中,一个指向指针的指针!)当函数不期望它时。请记住,引用不是指针。

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

但是,再次,这与继承或多态无关(除了使用它阻止你按值获取新对象的事实)。

答案 1 :(得分:1)

你正在混合引用和指针; What are the differences between a pointer variable and a reference variable in C++?涵盖了差异。

如果您想坚持引用,可以使用:

Sphere globe(...);

addObject(globe);

如果您正在使用new创建Sphere,可以使用:

Sphere *globe = new Sphere(...);

addObject(*globe);

答案 2 :(得分:0)

x * ptr = new x; candidateFunction(* PTR);

new返回一个指针,而不是对值的引用