C++虚函数复习过程中的一些错误

        最近准备求职,就到网上找一些题目,自己操作一下看看,然后就。。害,不扎实的基础+常年不操作函数了,补全编译就出错了。

题目如下:

class A{    
    char c_A;
};
class B : public A{    
    int i_A;    
    virtual funcA();    
    virtual funcB();
};


sizeof(B) = _____;sizeof(A) = _____;

加上main函数,看结果的代码如下:

#include <stdlib.h>
#include <iostream>
using namespace std;

class A {
        char c_A;
};
class B: public A {
        int i_A;
        virtual void funcA();
        virtual void funcB();
};
int main() {
        cout<<"sizeof(A)="<<sizeof(A)<<" sizeof(B)=" <<sizeof(B)<<endl;
        return 0;
}

到win10自带的ubuntu下面使用g++编译 ,编译语句为:g++ -o test test.cpp

执行生成的test可执行文件:./test

输出结果:sizeof(A)=1 sizeof(B)=16

以上过程为:正常测试该题流程,及输出结果。

下面记一下编译报错引发的知识点思考:

开始的工程代码,在求类的大小时候,老容易习惯性的声明类的对象,因此代码中就多了两行{

#include <iostream>
using namespace std;

class A {
        char c_A;
};
class B: public A {
        int i_A;
        virtual void funcA();
        virtual void funcB();
};
int main() {
        A TA;
        B TB;
        cout<<"sizeof(A)="<<sizeof(A)<<" sizeof(B)=" <<sizeof(B)<<endl;
        return 0;
}

然后编译的时候,就报错了,报错信息如下:

/tmp/ccjvHy5L.o: In function `B::B()':
test.cpp:(.text._ZN1BC2Ev[_ZN1BC5Ev]+0xb): undefined reference to `vtable for B'
collect2: error: ld returned 1 exit status

报错信息提示,无法生成B的虚函数表。

改正报错方法:是对B类中的虚函数进行定义,可以采取类内定义或者类外定义的方法:

类内定义:

class B: public A {
        int i_A;
        virtual void funcA(){}
        virtual void funcB(){}
};

类外定义:

#include <iostream>
using namespace std;

class A {
        char c_A;
};
class B: public A {
        int i_A;
        virtual void funcA();
        virtual void funcB();
};
void B::funcA()
{}
void B::funcB()
{}
int main() {
        A TA;
        B TB;
        cout<<"sizeof(A)="<<sizeof(A)<<" sizeof(B)=" <<sizeof(B)<<endl;
        return 0;
}

在修正过程中,曾试图把B类中虚函数声明为纯虚函数

#include <iostream>
using namespace std;

class A {
        char c_A;
};
class B: public A {
        int i_A;
        virtual void funcA()=0;
        virtual void funcB()=0;
};
int main() {
        A TA;
        B TB;
        cout<<"sizeof(A)="<<sizeof(A)<<" sizeof(B)=" <<sizeof(B)<<endl;
        return 0;
}

编译报错信息如下:

test.cpp:15:4: error: cannot declare variable ‘TB’ to be of abstract type ‘B’
  B TB;

报错信息提示,不可以为抽象类型B声明变量TB,也就是说抽象类不能实例化。

改正报错方法:把声明TB语句注释掉。

#include <iostream>
using namespace std;

class A {
        char c_A;
};
class B: public A {
        int i_A;
        virtual void funcA() = 0;
        virtual void funcB() = 0;
};
int main() {
        A TA;
//      B TB;
        cout<<"sizeof(A)="<<sizeof(A)<<" sizeof(B)=" <<sizeof(B)<<endl;
        return 0;
}

总结原因:

  1. 类中的virtual函数,要么设为纯虚函数,要么有定义,否则无法生成虚函数表。
  2. 设有纯虚函数的类,为抽象类,不能实例化。
  3. 虚函数的可以类外定义,但是必须加上类名,类外定义不需要加virtual;当然也可以类内定义。
  • 推荐博文:

C++虚函数声明和定义以及g++编译遇到的一些问题_GVFDBDF的专栏-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值