gpt4 book ai didi

c++ - 如何在给定派生类型指针的情况下有条件地将指针转换为基类型

转载 作者:行者123 更新时间:2023-11-30 01:51:01 26 4
gpt4 key购买 nike

我有两个派生类,TriangleSphere,它们来自基类 Shape

我有这样一种情况,我在 A 类中存储了一个基类指针 Shape*,并且有两个 A 类的重载成员函数> 对于每个派生类型,doSomething(Sphere* sp)doSomething(Triangle* tr)

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 * 类型的指针,它实际上指向派生对象之一。

那么,如何在不修改 TriangleSphere 类并且只修改 A 的情况下更好地解决这个问题?

最佳答案

在 C++ 中无法做到这一点。进行动态调度的唯一方法是调用虚方法:

shape->doSomething();

Triangle::doSomethingSphere::doSomething 可能是虚拟 Shape::doSomething 的不同实现。

因此,要么您需要更改代码结构,以便控制调用的是 shape 本身。或者...您可以拥有一个巨大的分支,您可以在其中依次尝试每个分支:

void doSomething() {
if (Triangle* t = dynamic_cast<Triangle*>(shape)) {
doSomething(t);
}
else if (Sphere* s = dynamic_cast<Sphere*>(shape)) {
doSomething(s);
}
// etc.
}

不过我建议不要这样做。除了难读之外,它还很慢且难以维护。

关于c++ - 如何在给定派生类型指针的情况下有条件地将指针转换为基类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26638243/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com