我需要一个基类来为我提供数据指针的原始类型。我在里面添加了一个函数。我派生了类的类型。我使用 void * 支持所有原始类型作为返回类型,但这就像旧的 C 时代一样。这对于 OOP 来说并不好。有人建议以正确的方式在 OOP 中进行操作吗?
#include <iostream>
class base {
public:
virtual void *getPtr() = 0;
virtual ~base() {};
};
class derivedAType : public base {
protected:
int _i;
public:
derivedAType(int i): _i(0) { _i = i; };
virtual ~derivedAType() {}
virtual void *getPtr() {
return static_cast<void *>(&_i);
}
};
class derivedBType : public base {
protected:
short _s;
public:
derivedBType(short s): _s(0) { _s = s; };
virtual ~derivedBType() {}
virtual void *getPtr() {
return static_cast<void *>(&_s);
}
};
int main()
{
base *b1 = new derivedAType(1203912);
base *b2 = new derivedBType(25273);
std::cout << "b1 : " << *(static_cast<int *>(b1->getPtr()))
<< "\nb2 : " << *(static_cast<short *>(b2->getPtr()))
<< std::endl;
delete b2;
delete b1;
return 0;
}
最佳答案
使基类成为模板类,数据类型为模板变量
template<typename DataType>
class base {
virtual DataType* getPtr() = 0;
//...
};
和
class derivedAType : public base<int>
但这会将基类更改为模板类,这意味着您无法将它们存储在一起,base<int>
与 base<short>
不同
如果这是 Not Acceptable ,其他选项只是比您的代码干净一点,但大致相同,请参阅 this question 。基本上派生类返回类型可以反射(reflect)它们的真实类型,我认为它应该自动转换为 void*
,因此您不必手动转换指针。
关于C++ 虚函数基返回类型建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13286171/