【发布时间】:2014-12-25 14:57:27
【问题描述】:
我有两个派生类,Triangle 和 Sphere,来自基类 Shape。
我有一种情况,我在类 A 中存储了一个基类指针 Shape*,并且对于每个派生类型 doSomething(Sphere* sp) 和 doSomething(Triangle* tr) 都有两个类 A 的重载成员函数。
class Shape
{
public:
Shape() {};
virtual ~Shape() = 0;
};
class Triangle : public Shape
{
public:
Triangle();
};
class Sphere : public Shape
{
public:
Sphere();
};
class A
{
private:
Shape* shape;
void doSomething(Triangle* tr);
void doSomething(Sphere* sp);
public:
A();
~A();
};
但是,当我尝试通过将 Shape* 类型的指针传递给 doSomething 函数来运行我的代码时,我收到以下错误:
candidate function not viable: cannot convert from base class pointer 'value_type'
(aka 'Shape *') to derived class pointer 'const Triangle *' for 1st argument
void A::doSomething(Triangle* tr) {
Sphere 的消息相同。我也确信虽然Shape * 类型的指针,它实际上指向派生对象之一。
那么,在不修改 Triangle 和 Sphere 类且只修改 A 的情况下,我该如何解决这个问题?
【问题讨论】:
-
无论人们是否有能力阅读字里行间并推断出您所询问的内容,如果您包含代码总是会更有帮助。考虑编辑以提供"Minimal, Complete, Verifiable Example"
-
重载解析纯粹是编译时的事情。如果动态类型与静态类型不同,您可以在运行时使用
dynamic_casttypeid或virtual函数的不同行为进行测试。前提是静态类型(即基类类型)至少有一个virtual函数或基类。