C++"虚拟参数"

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++标准的伏都教)都表示赞赏.

Ded*_*tor 6

您可以使用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"构造