gpt4 book ai didi

C++ 多态性和派生类类型 - "ugly programming"带指针类型转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:03 25 4
gpt4 key购买 nike

首先,我不确定如何用一行来准确描述我正在做的事情...因此标题有点模糊。

我能给出的问题的最简短描述是“我有一个函数,它应该能够将许多可能类型的类中的任何一种作为参数,并且这些类都是从基类派生的” .

具体来说,我有 2 个类别的类,它们都实现了不同类型的方法,它们相似但不完全相同。

也许我只举个例子会更好?你会看到我用指针类型转换做了一些有点奇怪的事情。我不认为这些是好的编程习惯。它们至少有点奇怪,我想知道是否有更好的替代方法。

好的,下面是我对简化示例的尝试:

class device
{
// Nothing here - abstract base class
}

class inputDevice : device // inherit publicly, but it doesn't matter
{
virtual input* getInput() { return m_input; } // input is a class
}

class outputDevice : device
{
virtual output* getOutput() { return m_output; } // output is also a class
}

class inputoutputDevice : public inputDevice, public outputDevice
{
// Inherits the get methods from input and output types
}

// elsewhere in program
void do_something(device* dev, int mode_flag)
{
if(mode_flag == 1) // just an example
{
input* = ((inputDevice*)dev)->getInput(); // doing strange things with pointers
}
else if(mode_flag == 2)
{
output* = ((outputDevice*)dev)->getOutput(); // strange things with pointers
}
else if(mode_flag == 3)
{

}
}

所以你看到这里的微妙之处在于函数有一些行为取决于我们处理的参数是输入设备还是输出设备。

我想我可以多次重载函数,但可能有许多不同类型的输入、输出或输入和输出设备...所以这将是一个相当复杂的方法。

将“get”方法放入基类似乎也不是一个好主意,因为如果设备是 OUTPUT 设备,派生类不应该有 getInput() 方法。同样,INPUT 设备不应该有 getOutput() 方法。从概念上讲,这似乎不对。

我希望我解释得够清楚,没有犯任何错误。

最佳答案

为了扩展我的评论,如果你 look at e.g. this input/output library reference你会看到一个 class diagram这在某种程度上提醒了您的类层次结构:有一个基类(实际上是两个)、一个“输入”类和“输出”类,以及一个继承自“输入”和“输出”类的“输入/输出”类“输出”类。

但是,您从未真正直接引用基类 std::basic_iosstd::ios_base , 相反 once 仅使用对 std::ostream 的引用对于任何输出流,std::istream对于任何输入流(和 std::iostream 对于任何输入和输出流)。

例如,要重载输入运算符 >>>,您的函数需要引用一个 std::istream 对象:

std::istream& operator>>(std::istream& input_stream, some_type& dest);

即使对于更通用的函数,您也可以引用 std::istreamstd::ostreamstd::iostream对象。你从不仅仅因为你遇到的问题而使用基类std::basic_ios


要与您的问题以及如何解决它有更多关联,请使用两个 函数重载,一个用于输入设备,一个用于输出设备。这更有意义,因为首先你不会遇到检查类型和转换的问题,还因为这两个函数的运行方式完全不同,这取决于你是在做输入还是输出,并试图将它们混合成一个函数只会让代码更难以维护。

所以你应该改为使用例如

void do_something(inputDevice& device);

void do_something(outputDevice& device);

关于C++ 多态性和派生类类型 - "ugly programming"带指针类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31639484/

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