【发布时间】:2014-01-02 06:05:42
【问题描述】:
我正在尝试使用 C++ 来模拟动态类型之类的东西。我正在处理继承类的问题。例如,一个函数可以定义为
BaseClass* myFunction(int what) {
if (what == 1) {
return new DerivedClass1();
} else if (what == 2) {
return new DerivedClass2();
}
}
基类和每个派生类将具有相同的成员,但类型不同。例如,BaseClass 可能有 int xyz = 0(什么都没有),DerivedClass1 可能有 double xyz = 123.456,DerivedClass2 可能有 bool xyz = true。然后,我可以创建返回一种类型但实际上返回几种不同类型的函数。问题是,当我尝试这样做时,我总是访问基类的xyz 版本。我尝试过使用指针(void* 用于基类,而“正确”用于派生类),但是每次我想访问成员时,我都必须执行类似 *(double*)(obj->xyz) 的操作,这最终会变得非常杂乱无章。
下面是我的代码大纲:
#include <iostream>
using std::cout;
using std::endl;
class Foo {
public:
Foo() {};
void* member;
};
class Bar : public Foo {
public:
Bar() {
member = new double(123.456); // Make member a double
};
};
int main(int argc, char* args[]) {
Foo* obj = new Bar;
cout << *(double*)(obj->member);
return 0;
};
我想我想问的是,这是“好的”编码实践吗?如果没有,对于返回多种类型或接受多种类型的函数是否有不同的方法?
【问题讨论】:
-
我更喜欢使用模板,而不是
void* -
请扩展...?我应该以什么方式使用模板?
-
在基类中,声明了
member。 -
然后从不同的模板中派生出派生类?这不会使它们成为不同的类型(我相信 C++ 将
BaseClass<int>视为与BaseClass<double>无关的类)? -
是的,结果就是这样。但我认为你也可以只提供一个模板化的成员函数,它至少包装来自
void*的演员表(可能还有一些静态检查),而不是让整个类成为模板。
标签: c++ derived-class return-type base-class