最近准备求职,就到网上找一些题目,自己操作一下看看,然后就。。害,不扎实的基础+常年不操作函数了,补全编译就出错了。
题目如下:
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;
}
总结原因:
- 类中的virtual函数,要么设为纯虚函数,要么有定义,否则无法生成虚函数表。
- 设有纯虚函数的类,为抽象类,不能实例化。
- 虚函数的可以类外定义,但是必须加上类名,类外定义不需要加virtual;当然也可以类内定义。
-
推荐博文: