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()
- 使用转交函数可以让父类的函数名可见
- 纯虚函数必须在派生类中重新声明,但也可以在类中有自己的实现。