C++: 父類調用子類的成員函數

C++ 中,父類是沒法調用到子類的成員函數的。當然,靜態函數可以被父類調用到;這裡只說普通函數。所以不能,是因為父類的定義中,還沒有見到子類的定義,所以沒法引用到子類的成員函數。 上面說的是在直接調用上,做不到。那麼有沒有別的方式做到呢?其實方法是有的。就是通過函數指針。當然,成員函數指針與一般函數指針有所區別。 例子如下:

#include <stdio.h>
class c2;
class c1
{
public:
    c2* c;
    void (c2::*f)(int);
    void f1()
    {
        (c->*f)(123); // 這裡就可以隨便調了,只要對c、f都賦好值了。
        // 如果要把子類同一類成員函數通過函數指針數組方式調用,
        // 那麼也類似地當然是可以實現的
        // 注意這裡的括號與*,都需要
    }
};

class c2: public c1
{
public:
    void f2(int i)
    {
        printf("f2(%d);\n", i);
    }
    void f3()
    {
        c = this;       // 傳對象的指針。成員函數訪問需要通過對象,所以還必須用它
        f = &c2::f2; // 給函數指針賦值
    }
};

int main()
{
    c2 c;
    c.f3();
    c.f1();
    return 0;
}

執行結果為:

f2(123);

上面實際上也演示了成員函數指針的用法。

那麼,只能通過成員函數指針嗎?有沒有別的方法了?其實還有個方法是通過模板類,至於怎麼做,具體就看例子吧:

#include<stdio.h>
template<typename T>
class c1
{
public:
    T* t;
    void f1()
    {
        printf("%d\n",
               t->xxx); // t 是模板類型T的指針,這樣即使不知道t的具體定義,
        // 也可以訪問到其成員,可以調用到其方法
        // 若非通過模板,就不能這樣
        t->f2();
    }
};

class c2: public c1<c2> // 這樣這裡
{
public:
    void f2()
    {
        printf("f2()\n");
    }
    int xxx ;
    void f3()
    {
        xxx = 123;
        t = this;   // 這個需要這樣設置
    }
};

int main()
{
    c2 c;
    c.f3();
    c.f1();
    return 0;
}

如果要以指針數組的方式調用子類成員函數,顯然只能用第一種