gpt4 book ai didi

c++ - 在没有动态转换或静态向下转换的情况下比较 C++ 中的派生类

转载 作者:可可西里 更新时间:2023-11-01 16:27:47 25 4
gpt4 key购买 nike

我正在尝试将公共(public)基类的对象放在一起进行比较。在任何情况下,当两个对象在类上不同,或者在特定于对象的值上不同时,比较都应该失败(例如,输出一个失败字符串)。理想情况下,比较是以某种方式强制执行的,这样一个新的派生类也必须为其类的成员编写一个比较函数。这是一个代码示例:

#include <iostream>
#include <string>
#include <vector>

class Vehicle
{
public:
virtual std::string compareTo(Vehicle* v) = 0;
};

class Bicycle : public Vehicle
{
public:
Bicycle() { color_ = "red"; }
std::string compareTo(Vehicle* v) { return "We're different vehicles."; }
std::string compareTo(Bicycle* b) { return color_.compare(b->color_) ? "We're different bicycles." : "We're the same bicycle."; }

private:
std::string color_;
};

class Car : public Vehicle
{
public:
Car() { style_ = "sedan"; }
std::string compareTo(Vehicle* v) { return "We're different vehicles."; }
std::string compareTo(Car* c) { return style_.compare(c->style_) ? "We're different cars." : "We're the same car."; }

private:
std::string style_;
};

int main()
{
Vehicle* compareFrom = new Bicycle();

std::vector<Vehicle*> compareTos;
compareTos.push_back(new Bicycle());
compareTos.push_back(new Car());

std::vector<Vehicle*>::iterator it;
for (it = compareTos.begin(); it != compareTos.end(); ++it)
std::cout << compareFrom->compareTo(*it) << std::endl;

return 0;
}

目前,输出(您可以看到 here )表示“我们是不同的车辆”。我知道这是因为我正在使用抽象基指针。问题是如何解决它!

想要的输出是自行车输出它们是相同的,因为它们确实具有相同的颜色。自行车和汽车应该输出它们是不同的车辆。不同颜色的自行车和不同款式的汽车也应该输出不同的信息。我觉得必须有一个很好的模式来解决这个问题,但我陷入了动态转换或不安全的向下转换问题。此外,我希望在同一类的成员之间强制执行比较功能(因此 Bicycles 必须能够与其他 Bicycles 进行比较)。

最佳答案

你想要 Multiple Dispatch (即根据多个变量,而不仅仅是“this”,选择要动态调用的函数)。这是因为您需要以某种方式检查类型,否则编译器将对类型进行静态分析并选择要调用的函数(Vehicle 中的虚拟函数)。

没有办法解决这个问题。 dynamic_cast 是您的 friend ,但出于性能(或其他)原因,您可能希望推出自己的 RTTI 系统。 (维基百科文章显示了一种方式..)

 std::string Bicycle::compareTo(Vehicle* v) { 
if (Bicycle* b = dynamic_cast<Bicycle*>(v)) {
return compareTo(b);
} else {
return "We're different vehicles.";
}
}

Loki C++ library 中有此模式的实现。如果您有许多类型需要比较,这可能会有所帮助。

C++ 中的语言不支持多重分派(dispatch),大多数主流语言也不支持。虽然有人提议将其添加到 C++11,请参阅 questionBjarne's paper .我认为它被拒绝是因为(已知和未知的)动态链接问题,遗憾的是 C++ 标准对此一无所知。

关于c++ - 在没有动态转换或静态向下转换的情况下比较 C++ 中的派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9021935/

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