C++ 转交函数

Effective C++中文版,第三版
第160页:

class Base {
public:
        virtual void mf1() = 0;
        virtual void mf1(int);
        ...
};

class Derived: private Base {
public:
        virtual void mf1(){ Base::mf1(); }
		...
};

...
Derived d;
int x;
d.mf1();
d.mf1(x);

猜想的原意是 让Derived在私有继承下只继承Base的mf1()函数.

认识较浅,没看明白: 在不实现Base的 virtual void mf1()=0; 的情况下,Derived是如何再次调用此父类Base的mf1().

于是编码测试此段代码:

#include <iostream>
#include <stdio.h>

class Base {
public:
        virtual void mf1() = 0 ;
        virtual void mf1(int);
};

class Derived: private Base {
public:
        virtual void mf1(){ Base::mf1(); }
};

int main( int argc,char *argv[] )
{
        using namespace std;
        
        Derived d;
        int x;
        d.mf1();

        return 0;
}
 g++ -o main main.cpp
/tmp/ccjDVN20.o:在函数‘Derived::mf1()’中:
main.cpp:(.text._ZN7Derived3mf1Ev[_ZN7Derived3mf1Ev]+0x14):对‘Base::mf1()’未定义的引用
/tmp/ccjDVN20.o:在函数‘Base::Base()’中:
main.cpp:(.text._ZN4BaseC2Ev[_ZN4BaseC5Ev]+0x9):对‘vtable for Base’未定义的引用
/tmp/ccjDVN20.o:(.rodata._ZTV7Derived[_ZTV7Derived]+0x18):对‘Base::mf1(int)’未定义的引用
/tmp/ccjDVN20.o:(.rodata._ZTI7Derived[_ZTI7Derived]+0x18):对‘typeinfo for Base’未定义的引用
collect2: error: ld returned 1 exit status

提示一些错误,那么继续将代码修改一下

#include <iostream>
#include <stdio.h>

class Base {
public:
        virtual void mf1() = 0;
        virtual void mf1(int){ }
};

void Base::mf1()
{
        std::cout << "Base pure mf1()" << std::endl;
}

class Derived: private Base {
public:
        virtual void mf1(){ Base::mf1(); }
};

int main( int argc,char *argv[] )
{
        using namespace std;
        
        Derived d;
        int x;
        d.mf1();

        return 0;
}

编译:

g++ -o main main.cpp
 ./main
Base pure mf1()
  1. 使用转交函数可以让父类的函数名可见
  2. 纯虚函数必须在派生类中重新声明,但也可以在类中有自己的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值