实现:
class A {
public:
string name;
A();
A(string &name) : name(name) {
}
virtual void out1()=0; /////纯虚函数 由子类实现
virtual ~A() {};
virtual void out2() ////虚函数 /默认实现
{
cout << "A(out2)" << endl;
}
virtual void out4(); //这种方式貌似不允许 必须加上=0
void out3() ///普通类函数
{
cout << "A(out3)" << endl;
}
};
A::A() {
}
class B : public A {
public:
B(string &name) : A(name) {}
B();
virtual ~B() {};
void out1() {
cout << "B(out1)" << endl;
}
void out2() {
cout << "B(out2)" << endl;
}
void out3() {
cout << "B(out3)" << endl;
}
void out4() {
};
};
B::B() {
}
调用:
// 无法实例化A
// A *a = new A;
// A *ab_ = new A(*new string("asd"));
// 可以实例化
// A *ab = new B(*new string("asd"));
A *ab = new B;
ab->out1();
ab->out2();
ab->out3();
cout << "************************" << endl;
B *bb = new B;
bb->out1();
bb->out2();
bb->out3();
delete ab;
delete bb;
输出:
B(out1)
B(out2)
A(out3)
************************
B(out1)
B(out2)
B(out3)
总结:
1.可以用Java的方式来理解,虚函数相当于java的protected方法,子类实不实现都无所谓,纯虚函数就相当于父类的抽象函数,此时父类必须抽象,java是给出abstract申明,且不可实例化,C++则:
a.将 B类中修改为void out1();则报错:undefined reference to `vtable for B’
b.B类直接删除out1的实现则报如下错误,编译通过,这属于运行时异常,不好找出问题的:
D:\WorkSpace_C\CaddMore\main.cpp: In function 'int main()':
D:\WorkSpace_C\CaddMore\main.cpp:69:15: error: invalid new-expression of abstract class type 'B'
A *ab=new B;
^
D:\WorkSpace_C\CaddMore\main.cpp:30:7: note: because the following virtual functions are pure within 'B':
class B : public A {
^
D:\WorkSpace_C\CaddMore\main.cpp:16:18: note: virtual void A::out1()
virtual void out1()=0; /纯虚函数 由子类实现
^~~~
D:\WorkSpace_C\CaddMore\main.cpp:74:15: error: invalid new-expression of abstract class type 'B'
B *bb=new B;
2.纯虚函数A不能被实例化。
3. A();和B();其实都是构造函数的申明(搞java的容易看成成员变量 - _ - !),一定记得要实现,这个不写是不会有提示的。
4. A虽然为抽象类,不过仍然是可以写构造函数的,通过B实例化实现A,实现多态。
5.virtual void out4();貌似不允许。