IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++虚函数复习过程中的一些错误 -> 正文阅读

[C++知识库]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博客

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-08 13:38:17  更:2021-12-08 13:39:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:57:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码