【发布时间】:2015-08-11 09:03:13
【问题描述】:
我有一个具有相当复杂的继承结构的程序,所以我不会用它来展示我的问题,而是以下结构使用糟糕的样式来保持简单:
class A {
public:
int va1;
int va2;
string va3;
virtual void fa1(int x1, string x2) {
// method body
}
int fa2 (bool y1, double y2) {
// method body
}
A() {
}
virtual ~A() {
}
};
class B :
public A
{
public:
bool ab1;
double ab2;
long double ab3;
bool fb1(double x1) {
//method body
}
long double fb2() {
//method body
}
B(int z1) {
ab2 = z1;
}
virtual ~B() {
}
};
class C :
public A
{
public:
int ac1;
long double fc1() {
//method body
}
virtual void fa1(int x1, string x2) {
// method body
}
C() {
}
virtual ~C() {
}
};
如您所见,B 和 C 都主要由全新的变量和方法组成,而不是从 A 重新定义的变量和方法。 因此,将 A 指针与虚方法结合使用是行不通的。
直到现在,我一直对派生类使用单独的向量或数组,因为我很少编写主要由仅重新定义基类的方法的派生类组成的程序。
我知道我不能简单地创建一个 As 向量并放入 Bs 和 Cs 而不会丢失信息。
我的问题是,是否可以将 As、Bs 和 Cs 以指针或其他形式存储在单个向量中,并且仍然可以访问 A 中不存在的所有方法和变量?
如果它不适用于向量,是否有替代方案(可能是数组)?
代码可以包含现代 C++(标准、std::string 而不是 char* 等),因为不需要与 C 或传统 C++ 兼容。
【问题讨论】:
-
您可以始终将所有内容存储为
A*,然后尝试将dynamic_cast设置为所需的派生类型。如果转换失败,那么你知道你不能调用这个函数。 -
为什么将 A 指针与虚方法结合使用不起作用?另外,只需创建一个 As 的向量并放入 Bs 和 Cs,您会丢失哪些信息?
-
[OT] 从什么时候开始使用
std::string变成“modern C++”了?! -
如果你有一个带有 virtual void example(int x) {} 的类 Base 和一个带有 virtual void example(int x) {} 的 Derived 类,则虚拟函数可以很好地工作。如何解决这个问题,我自己知道。但是如果我想访问 int notInBase(double x) {} 呢?由于在 Base 中没有调用类似的方法,现在(至少据我所知)可以使用 virtual 访问方法(来自 Derived)。
-
"[OT] 从什么时候开始使用 std::string 变成了“现代 C++”?!"我仍然看到大多数 C++ 程序员使用或推荐使用 char* 或 char[] 代替字符串,即使不使用 WindowsAPI 或其他遗留代码也是如此。但也许我认识错误的人并访问了一些不一般的网站。但这并不重要。我只是想确保我对新的 C++ 标准和非 C 兼容习惯没有问题,因为它不会破坏我的程序。
标签: c++ inheritance vector derived-class base-class