首页 > 编程语言 >c++ virtual关键字学习

c++ virtual关键字学习

时间:2023-01-08 13:59:01浏览次数:47  
标签:BaseSub ...... c++ class 关键字 Base virtual public

virtual在类中使用

如在多继承中(环状继承):

class D{......};
class B: public D{......};
class A: public D{......};
class C: public B, public A{.....};

这个继承会使D创建两个对象,要解决这个问题就可以使用虚拟继承格式:

class D{......};
class B: virtual public D{......};
class A: virtual public D{......};
class C: public B, public A{.....};

虚继承:在创建父类的时候(在创建对象的时候会创建一个虚表)。

#include <iostream>
using namespace std;

class D
{
public:
    D()
    {
        cout << "D()" << endl;
    }
    ~D()
    {
        cout << "~D()" << endl;
    }

protected:
    int d;
};

class B : virtual public D
{
public:
    B()
    {
        cout << "B()" << endl;
    }
    ~B()
    {
        cout << "~B()" << endl;
    }

protected:
    int b;
};

class A : virtual public D
{
public:
    A()
    {
        cout << "A()" << endl;
    }
    ~A()
    {
        cout << "~A()" << endl;
    }

protected:
    int a;
};

class C : public B,
          public A
{
public:
    C()
    {
        cout << "C()" << endl;
    }
    ~C()
    {
        cout << "~C()" << endl;
    }

protected:
    int c;
};

运行测试

int main()
{
    /*
    the order of class constract with keyword virtual: D,B,A,C;
    otherwise: D,B,D,A,C; create class D twice;
    */
    C c;
    cout << "sizeof(c): " << sizeof(c) << endl;
    return 0;
}

测试结果

D()
B()
A()
C()

~C()
~A()
~B()
~D()

 

 virtual在函数中使用

类Base中加了virtual关键字的函数就是虚拟函数(例如下面例子中的函数print),于是在Base的派生类BaseSub中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。

当基类Base的指针base_prt指向派生类BaseSub的对象时,对base_prt的print函数的调用实际上是调用了BaseSub的print函数而不是Base的print函数。

这是面向对象中的多态性的体现。

class Base
{
public:
    Base() { cout << "Base()" << endl; };
    ~Base() { cout << "~Base()" << endl; };
    virtual void paint() { cout << "paint Base" << endl; };
};

class BaseSub : public Base
{
public:
    BaseSub() { cout << "BaseSub()" << endl; };
    ~BaseSub() { cout << "~BaseSub()" << endl; };
    void paint() { cout << "paint BaseSub" << endl; };
};

测试代码

int main()
{
    Base *base_prt = new BaseSub();
    // call paint() in class BaseSub, because keyword virtual;
    base_prt->paint();
    delete base_prt;
    return 0;
}

运行结果

Base()
BaseSub()
paint BaseSub
~Base()

 

不错的学习内容

标签:BaseSub,......,c++,class,关键字,Base,virtual,public
From: https://www.cnblogs.com/johnnyzhao/p/17034509.html

相关文章

  • re | [MRCTF2020]VirtualTree
    re|[MRCTF2020]VirtualTree这个题是一个错题,是有多解的。原因是使用了abs函数考察了二叉树后序遍历,和一点基本花指令,还有一点点smc的内容。直接丢exp了:#include<s......
  • C++ - 多线程
    1.多线程传统的C++(C++11之前)中并没有引入线程这个概念,在C++11出来之前,如果我们想要在C++中实现多线程,需要借助操作系统平台提供的API,比如Linux的<pthread.h>,或者windows下......
  • [C++/Java/Py/C#/Ruby/Swift/Go/Scala/Kotlin/Rust/PHP/TS/Elixir/Dart/Racket/Erlang
    目录题解地址代码cppjavapython3C#rubyswiftgolangscalakotlinrustphptypescriptelixirdartracketerlang题解地址https://leetcode.cn/problems/counting-words-with-a-g......
  • VirtualBox 笔记
    1tipsIDE设备挂载点在/dev/sr0sr1...#redhat9.12在VirtualBox下安装Linux的增强功能(鼠标无缝切换等)官网下载安装(可能要更新VirtualBox版本):Oracle_VM_Virtua......
  • C++初探索
    C++初探索前言C++和C的区别主要在8个方面:输入和输出引用inline函数函数默认值函数重载模板函数new和deletenamespace我仅对印象不深的地方做了总结。......
  • C++中的锁
    锁(161条消息)C++互斥对象std::mutex与std::shared_mutex;互斥锁:std::lock_guard、std::unique_lock与std::shared_lock的应用_持续学习,不断沉淀的博客-CSDN博客......
  • c++大全
    第一章编程基础 91.1通俗地理解什么是编程语言 91.2C语言究竟是一门怎样的语言? 111.3C语言是菜鸟和大神的分水岭 121.4进制详解:二进制、八进制和十六进制 131.5......
  • VirtualBox,出现错误:Not in a hypervisor partition
    可能是bios的cpu设置中的虚拟化功能没有开启,去bios开启就行了。https://blog.csdn.net/weixin_39388918/article/details/105974443......
  • c++强制类型转换
    四大强制类型转换使用强制类型转换意味着放弃c++的安全保障static_cast语法static_cast<type-id>(expression)作用将表达式转换为type-id类型注意......
  • C++实现链式表示多项式加法运算
    #include<iostream>#include<cstdlib>usingnamespacestd;#defineMAXSIZE100#defineOK1#defineERROR0typedefintElemtype;typedefintStatus;typedefstructPNo......