将派生自基数 class 的 class 实例传递给函数
Pass an instance of a class deriving from a base class into a function
我的 C++ 程序中有一个 class 层次结构:
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(...))
,但是,没有任何效果。
我怎样才能让它发挥作用?
您正在混合引用和指针; What are the differences between a pointer variable and a reference variable in C++? 涵盖差异。
如果你想坚持引用,你可以使用:
Sphere globe(...);
addObject(globe);
如果您正在使用新的动态创建 Sphere,您可以使用:
Sphere *globe = new Sphere(...);
addObject(*globe);
x *ptr=新x;
candidateFunction(*ptr);
新建 returns 一个指针,而不是对值的引用
(我已经在两个小时前在聊天中回答了这个问题。这是我说的。)
这完全取决于。这不是关于多态性的问题;这是一个关于对象所有权以及你打算如何构建你的对象的问题。
现在你最大的问题是你试图传递一个指针(或者,在你荒谬的后一个例子中,一个指向指针的指针!)当函数不期望一个。请记住,引用不是指针。
似乎接受指向该函数的指针似乎更有意义。考虑使它成为某种 C++11 智能指针。
但是,同样,这与继承或多态性完全无关(除了使用它会阻止您按值获取新对象这一事实)。
我的 C++ 程序中有一个 class 层次结构:
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(...))
,但是,没有任何效果。
我怎样才能让它发挥作用?
您正在混合引用和指针; What are the differences between a pointer variable and a reference variable in C++? 涵盖差异。
如果你想坚持引用,你可以使用:
Sphere globe(...);
addObject(globe);
如果您正在使用新的动态创建 Sphere,您可以使用:
Sphere *globe = new Sphere(...);
addObject(*globe);
x *ptr=新x; candidateFunction(*ptr);
新建 returns 一个指针,而不是对值的引用
(我已经在两个小时前在聊天中回答了这个问题。这是我说的。)
这完全取决于。这不是关于多态性的问题;这是一个关于对象所有权以及你打算如何构建你的对象的问题。
现在你最大的问题是你试图传递一个指针(或者,在你荒谬的后一个例子中,一个指向指针的指针!)当函数不期望一个。请记住,引用不是指针。
似乎接受指向该函数的指针似乎更有意义。考虑使它成为某种 C++11 智能指针。
但是,同样,这与继承或多态性完全无关(除了使用它会阻止您按值获取新对象这一事实)。