首页 > 编程语言 >C++定义,继承和虚函数

C++定义,继承和虚函数

时间:2024-04-16 19:55:05浏览次数:19  
标签:定义 C++ ppte Base virprint 父类 ptr 函数

类定义方式一般有两种

Base b和Base b(3);一种不带参数,一种带参数,这两种实例定义会在范围结束自动释放。

Base *c = new Base;和Base *c = new Base(5);没有参数可不加括号。通过new申请的类,需要手动delete释放,否则需要关闭程序才会释放(说的内存泄漏是指程序一直运行期间不断产生新的分配内存未删除)。

继承

继承父类,父爷类带有virtual修饰的函数,子类可选加virtual修饰 自动算虚函数。

带纯虚函数的父类则是抽象类virtual void f()=0,父类不可实例化,其子类必须对函数实现。

父类包含的函数,爷类不包含,子类则不能用爷类去引用,如dd pd; Base a=ⅆ错误。

#include <iostream>


class Base {
public:
    Base(){
        std::cout << "this Base init" << std::endl;
    }
    Base(int i) {
        std::cout << "Base init cout " << i << std::endl;
    }
    void print() {
        std::cout << "Base::print()" << std::endl;
    }
    virtual void virprint() {
        std::cout << "Base::virprint()" << std::endl;
    }
};

class Derived : public Base {
public:
    Derived();
    void print() {
        std::cout << "Derived::print()" << std::endl;
    }
    void virprint() {
        std::cout << "Derived::virprint()" << std::endl;
    }
     void cpr() {
        std::cout << "Derived::cpr()" << std::endl;
    }

};
class dd :public Derived {
public:
    void virprint() {
        std::cout << "dd::virprint()" << std::endl;
    }
     void cpr() {
        std::cout << "dd::cpr()" << std::endl;
    }
};
Derived::Derived() {
    std::cout << "this Derived init" << std::endl;
}
int main() {
    Base b(3);//会自动释放
    std::cout << "after this b " << std::endl;
    Base *c=new Base;//需要手动释放
    std::cout << "after this c " << std::endl;
    Base *c1;
    std::cout << "after this c1 " << std::endl;
    Derived d;
    dd pd;
    c = &b;
    Base* ptr = &b;  // 指向基类对象
    ptr->print();  // 调用基类版本
    ptr->virprint();
    ptr = &d;  // 指向派生类对象
    ptr->print();  // 调用派生类版本
    ptr->virprint();
    Derived* ppte = &pd;
    ppte->print();
    ppte->virprint();
    ppte->cpr();

    delete c;
    return 0;
}

打印:

 

标签:定义,C++,ppte,Base,virprint,父类,ptr,函数
From: https://www.cnblogs.com/fzzfh/p/18139057

相关文章

  • 自定义pre-commit 开发格式简单说明
    内容来自官方文档,主要是简单说明下,方便学习约定git项目需要包含.pre-commit-hooks.yaml文件,里边内容格式如下-id:trailing-whitespacename:TrimTrailingWhitespacedescription:Thishooktrimstrailingwhitespace.entry:trailing-w......
  • C++ list erase
    原文:https://www.cnblogs.com/yelongsan/p/4050404.htmlSTL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。      在使用list、set或m......
  • R中遇到dplyr::filter等函数冲突--优先设置某个包
    用conflicted包解决参考:https://blog.csdn.net/qazplm12_3/article/details/119621588#1安装软件包install.packages("conflicted")#2显示冲突的包library(conflicted)conflict_scout()#3设置优先使用的包的函数(例如上述的`filter()`:dplyrandstats冲突)#优先使......
  • range函数python用法
    range函数python用法概述range()是python的一个内置函数,用来创建一个整数序列,常用于for循环中。理解range()的运用会对我们使用循环很有帮助。语法range函数语法格式如下:-start:序列的起始数值,默认从0开始-stop:序列结束的数值(不包含在序列中)-step:步长,默认为1参数说明......
  • 深度解读《深度探索C++对象模型》之默认构造函数
    接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,主动获得推文。提到默认构造函数,很多文章和书籍里提到:“在需要的时候编译器会自动生成一个默认构造函数”。那么关键的问题来了,到底是什么时候需要?是谁需要?比如下面的......
  • python-函数参数的学习
    '''函数的参数实际上是实际参数传给形式参数的过程通用性更强,可以理解为一个模版'''#defadd(a,b):#a,b是形参#print(a+b)#add(2,3)#传递参数'''1.必选参数,定义了几个,就必须传几个'''#deffunb(a,b):#result=a-b#print(result)#funb......
  • 第十五届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组
    Preface答辩圈钱杯,去年省赛的题好歹还有些有意思的题(指杜教筛),今年变成煞笔题开会了是吧两个小时多一点就全写完了,然后开始给后面三题写对拍(结果发现其实都没写挂纯在浪费时间)考完感觉AK有望,结果后面发现最后一题漏看条件了,苦露西而且中间EF两题全偷懒开__int128了,反正用下发的......
  • 10.函数对象 与 闭包函数
    【一】函数对象Python中一切皆对象可直接被引用定义一个函数,用一个新的变量名来存,来调用可作为元素被储存功能字典中函数的地址可作为参数传递给另一个函数将函数的内存地址作为参数函数的返回值可以是函数直接将函数的内存地址返回【二】闭包函数1)......
  • 华为实习4.10机考第二题C++代码
    考的是简单的并查集这道题考法就是并查集,若两个图片相似度大于0,则将他们放到一个家族中,同时维护家族的相似度总和。注意M矩阵是对称矩阵,所以需要避免重复维护相似度,因此可以只针对M矩阵的下三角矩阵或上三角矩阵中的连接块,计算相似度总和;或考虑整个M矩阵,然后相似度总和除......
  • js--参数归一化-日期格式化函数
    //参数归一化///*日期时间格式化date:日期时间isFillZero:是否需要0补位*/functionformate(date,formater,isFillZero=false){formater=_formatNormalize(formater)function_isFillZero(value,length){if(isFillZero){return(value+'').p......