par*_*iad 3 c++ virtual-functions
请考虑以下代码:
class A {
public:
virtual ~A() {}
};
class AA : public A {
};
////////////////////////////////////////
class B {
public:
virtual void f(const A &a) {
// code for A
}
};
class BB : public B {
public:
virtual void f(const AA &a) {
// code for AA
}
};
////////////////////////////////////////
int main() {
A *a = new AA;
B *b = new BB;
b->f(*a);
}
Run Code Online (Sandbox Code Playgroud)
显然,构造vtable使得当执行上述操作时// code for A.我正在寻找一种能够执行的方法// code for AA.
动机是这是一个代码库,最终用户通常必须编写BB形式的类,我希望这个过程尽可能简单(即用户不必使用RTTI找出他们正在处理的A派生类).任何想法(以及来自任何版本的C++标准的伏都教)都表示赞赏.
您可以使用RTTI并显式执行自己的调度.
Co-Variant类型仅适用于返回类型.
例:
class B {
void f_base(const A &a) {
// code for A
}
public:
virtual void f(const A &a) {
f_base(a); // Moved the base case outside
// to isolate the dispatching mechanism.
}
};
class BB : public B {
public:
virtual void f(const A& a) {
const AA* pAA = dynamic_cast<const AA*>(&a);
if(pAA) {
f(*pAA);
return;
}
f_base(a);
}
void f(const AA &a) {
// code for AA
}
};
Run Code Online (Sandbox Code Playgroud)
这里演示了这种类型的调度以及带模板的更好的打包的更多讨论:C++ 11中的"type-switch"构造
| 归档时间: |
|
| 查看次数: |
173 次 |
| 最近记录: |