【发布时间】:2015-04-02 09:08:56
【问题描述】:
我正在使用的外部库具有以下结构:
#include <stdio.h>
struct A {
protected:
virtual void f() {}
};
struct B : A {
void f() {printf("B\n");}
};
我现在已经扩展了这个库
struct C : A {
void f() {printf("C\n");}
};
现在我想要一个struct D : A,它使用B 或C 的f(),具体取决于运行时可用的信息。我无法修改库,并且从B 继承C 是不切实际的,因为B 比C 复杂得多。这就是我想出的:
struct _A : A {
// bypass protected
inline void _f() {f();}
};
struct D : A {
D(char x) {
switch (x) {
case 'B': p = (_A*) new B(); break;
case 'C': p = (_A*) new C(); break;
}
}
~D() {delete p;}
void f() {p->_f();}
_A* p;
};
int main() {
D b('B'), c('C');
b.f();
c.f();
}
我在 MacOSX 上对其进行了测试,它在 g++ 和 clang++ 上都能正常工作。但是一般来说安全吗?如果没有,有更好的方法吗?
【问题讨论】:
-
B、C和_A不相关。试图将一个视为其他之一是未定义的行为。