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

Posted

技术标签:

【中文标题】将派生自基类的类的实例传递给函数【英文标题】:Pass an instance of a class deriving from a base class into a function 【发布时间】:2015-01-25 19:13:27 【问题描述】:

我的 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'

当我谷歌了一下,我发现你可以通过引用传递对象。

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

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

我怎样才能让它工作?

【问题讨论】:

也许查一下new 做了什么。 【参考方案1】:

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

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

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

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

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

【讨论】:

【参考方案2】:

您正在混合引用和指针; 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);

【讨论】:

但是在这种情况下你为什么要使用new @juanchopanza 我正在为我的 raymarcher 构建一个包含许多对象的场景。为每个创建的对象编写多行代码是多余的。 @Mateon1 这与我所说的无关。 @juanchopanza 这取决于要求是什么。在调用函数中使用 new 会创建一个在调用函数退出后仍然存在的类的实例;使用函数范围的实例将导致在调用函数退出时回收对象内存。也许您应该按照自己的建议来查找新功能?【参考方案3】:

x *ptr=新的 x; 候选函数(*ptr);

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

【讨论】:

以上是关于将派生自基类的类的实例传递给函数的主要内容,如果未能解决你的问题,请参考以下文章

将派生类传递给采用 SWIG Python 中的基类的函数

C ++继承:将子类传递给期望基类的函数并获得子类行为

虚函数总结

c ++将不同的类传递给函数

调用派生类的构造函数在基类的构造函数之前执行

包含指向派生模板类的基类指针的类的赋值运算符和复制构造函数