C++之虚函数的使用及抽象类

在学C++,好像准程序猿都有在CSDN做笔记的习惯,所以我也加入这个队列吧!

记录下学C++的坑。

如发现错误希望能及时提醒,共同进步。


先贴代码吧

例一

#include   <iostream>
#include   <complex> //复数类
using namespace   std;

class Base
{
public:
    Base() {cout<<"Base-ctor"<<endl;}
    ~Base() {cout<<"Base-dtor"<<endl;}
    virtual void f(int){cout<<"Base::f(int)"<<endl;}//虚成员函数,由于没有真实用到,可以只写类型
    virtual void f(double){cout<<"Base::f(double)"<<endl;}//两个f()函数由于参数类型不同因此构成函数重载
    virtual void g(int i=10){cout<<"Base::g()"<<i<<endl;}
};
class Derived : public Base
{
public:
    Derived() {cout<<"Derived-ctor" <<endl;}
    ~Derived(){cout<<"Derived-dtor"<<endl;}
    void f(complex<double>) {
        cout<<"Derived::f(complex)"<<endl;
    }
    void g(int   i=20){
        cout<<"Derived::g()"<<i<<endl;
    }
};
int main()
{
    cout<<sizeof(Base)<<endl; //c++类的大小只与数据成员大小及虚拟指针大小有关
    cout<<sizeof(Derived)<<endl;

    Base b;
    Derived d;
    Base *pb=new Derived;
    b.f(1.0);
    d.f(1.0);
    pb->f(1.0);
    b.g();
    d.g();
    pb->g();//基类中g(int i=10)的初始化是在编译时执行的,但由于运行时派生类中的g将基类的g函数覆盖了,因此输出为Derived::g()10;
  delete pb;
  return 0;
}

结果

4
4
Base-ctor
Base-ctor
Derived-ctor
Base-ctor
Derived-ctor
Base::f(double)
Derived::f(complex)
Base::f(double)
Base::g()10
Derived::g()20
Derived::g()10
Base-dtor
Derived-dtor
Base-dtor
Base-dtor


例二

#include   <iostream>
using   namespace   std;
class   Base
{
public:
    Base():data(count)
    {
        cout<<"Base-ctor"<<endl;
        ++count;
    }
    ~Base()
    {
        cout<<"Base-dtor"<<endl;
        --count;
    }
    static int count;
    int data;
};
int Base::count;
class Derived  : public Base
{
public:
    Derived():data(count),data1(data)
    {
        cout<<"Derived-ctor"<<endl;
        ++count;
    }
    ~Derived()
    {
        cout<<"Derived-dtor"<<endl;
        --count;
    }
    static int count;
    int data1;
    int data;
};
int Derived::count=10;
int main()
{
    cout<<sizeof(Base)<<endl;
    cout<<sizeof(Derived)<<endl;

    Base* pb = new Derived[3];
    cout<<pb[2].data<<endl;
    cout<<((static_cast<Derived*>(pb))+2)->data1<<endl;
    delete[] pb;

    cout<<Base::count<<endl;
    cout<<Derived::count<<endl;
    return 0;
}

结果

4
12
Base-ctor
Derived-ctor
Base-ctor
Derived-ctor
Base-ctor
Derived-ctor
10
1702130553
Base-dtor
Base-dtor
Base-dtor
0
13

下面这句代码是关于地址分配的

Base* pb = new Derived[3];
Derived [0] [1] [2]
Base.data 0   pb[0] 1   pb[3] 2   pb[6]
Derived.data 不可知数   pb[1] 不可知数   pb[4] 不可知数   pb[7]
derived.data1 10   pb[2] 11   pb[5] 12   pb[8]

上表为pb指针的对应地址的数据,直接访问时pb指针只能访问Base.data,因为pb的类型为Base


C++类的大小参考博文https://www.cnblogs.com/sz-leez/p/7119232.html

ps:本博文只用于日常备注及学习交流,请勿用于任何商业用途,涉及网摘等资料如有侵犯原作者权利,请联系确保及时更正!

猜你喜欢

转载自blog.csdn.net/weixin_38161055/article/details/80270072
今日推荐