C++纯虚函数

实现:

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();貌似不允许。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值