首页 > 编程语言 >C++继承顺序

C++继承顺序

时间:2024-01-17 22:22:45浏览次数:32  
标签:顺序 访问 继承 基类 C++ int no 派生类 yes

派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。

我们可以根据访问权限总结出不同的访问类型,如下所示:

访问 public protected private
同一个类 yes yes yes
派生类 yes yes no
外部的类 yes no no

一个派生类继承了所有的基类方法,但下列情况除外:

  1. 基类的构造函数、析构函数和拷贝构造函数。
  2. 基类的重载运算符。
  3. 基类的友元函数。
#include <iostream>
using namespace std;
class Base{
    public:
        int a;
        int b;
    Base(int a=0, int b=0){
        this->a = a;
        this->b = b;
        cout<<"Constructor Base::Base("<<a<<","<<b<<")"<<endl;
    }
    ~Base(){
        cout<<"destructor Base..."<<endl;
    }
    int product(){
        return this->a * this->b;
    }
    friend std::ostream &operator<<(std::ostream &os, const Base &obj){
        os<<"Base: a="<<obj.a<<",b="<<obj.b;
        return os;
    }
};

class Derived: public Base{
    public:
        int c;
    // 继承Base类,会首先自动调用Base的构造函数
    // 然后再去执行子类的构造函数
    Derived(int c):Base(c-2, c-1), c(c){
        // 这个a来自父类Base,在父类构造函数之后修改
        this->a += 3;
        cout<<"constructor Derived("<<c<<")"<<endl;

    }
    ~Derived(){
        cout<<"destructor Derived("<<c<<")"<<endl;

    }
    int product(){
        // 子类调用父类的product
        return Base::product() * c;
    }
    friend std::ostream &operator<<(std::ostream &os, const Derived &obj){
        // 
        os<<static_cast<const Base&>(obj) << endl;
        os<<"Derived: c="<<obj.c;
        return os;
    }
};

int main(int argc, const char** argv) {
    Base base(1,2);
    cout<<base<<endl;
    int r = base.product();
    cout<<r<<endl;
    cout<<"------------------"<<endl;

    Derived derive(5);
    // 会调用Base(0, 1)
    cout<<derive<<endl;
    cout<<"product"<<derive.product()<<endl;

    return 0;
}

标签:顺序,访问,继承,基类,C++,int,no,派生类,yes
From: https://www.cnblogs.com/bai7/p/17971324

相关文章

  • 猫狗收容所 C++
    #include<iostream>#include<queue>usingnamespacestd;voiddelect(queue<int>*q,intx){if(q->empty())return;for(inti=0;i<q->size();i++){intt=q->front();q->pop();if(t!=x)q->push......
  • C++开发基础
    软件开发基础2024-01-0820:13星期一博客内容来自相关书籍和网站内容总结,仅供个人参考使用:笔者@东北大学StuBoo使用目录快速转到面试问题汇总、常见算法问题1.C++语言基础1.1C++语言特性概览面向对象编程(OOP):C++支持面向对象编程,包括封装、继承和多态。通过类和对象,可......
  • c++开发面试Q&A
    面试问题Q&A现阶段问题还没有归类,等待更新C++语言基础QC和C++两者优缺点,适合情况C语言特点:优点:简洁、高效、可移植性强、面向过程、底层控制、资源利用高。适用情况:嵌入式系统、操作系统、编译器、硬件驱动开发、对性能要求高的系统。C++语言特点:优点:面向对象、支持......
  • Day52 什么是继承
    什么是继承(JAVA中类只有单继承,没有多继承)继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。(国家中国人美国人...)(PersonStudentTeacher)extends的意思是“扩展”。子类是父类的扩展。publicclassStudentextendsP......
  • java继承
    java三大特征:封装、继承、多态封装:对象代表什么就得封装什么样的数据,并提供数据对应的行为。继承java中提供了一个extends关键字,用这个关键字可以让一个类和另外一个类建立起继承关系publicclassStudebtextendsPerson(){}例如上段代码中,Student类就叫子类(派生类),Person......
  • 3254:约瑟夫问题No.2C++
    \这题思路还是挺多的。如果用数学的角度考虑。知道了n,p,m自然就知道下一个要出队的人的编号。然后一个个输出就行了。还可以用循环链表做。还可以用队列。出队在入队。#include<iostream>#include<queue>usingnamespacestd;intmain(){intn,p,m;while(......
  • C++ 面试题
    目录构造函数不能声明为虚函数虚函数表是如何在C++中被初始化的?虚函数表和虚函数指针在内存中的具体存储方式是什么?构造函数不能声明为虚函数在C++中,构造函数不能声明为虚函数。这是因为在执行类的构造函数时,内存中还没有虚表,也就是还没有定义虚指针。因此,构造函数必须始终是非......
  • C++中setw和setfill函数的结合应用
    一、头文件头文件为#include<iomanip>其中io代表输入输出,manip是manipulator(操纵器)的缩写iomanip的作用:主要是对cin,cout之类的一些操纵运算子,比如setfill,setw,setbase,setprecision等等。它是I/O流控制头文件,就像C里面的格式化输出一样。二、setw函数s......
  • KY20 完数与盈数C++
    练习使用向量vector容器。遍历每个数取余就好了。然后记录下来。#include<iostream>#include<vector>usingnamespacestd;intmain(){vector<int>B;vector<int>C;for(inti=2;i<=60;i++){vector<int>A;intm;......
  • mysql 语句执行顺序
    MySQL语句的大致执行顺序如下:FROM:指定要查询的表。JOIN:根据指定的条件,将两个或多个表合并为一个结果集。WHERE:对查询结果进行筛选,只保留满足指定条件的行。GROUPBY:将结果集按照指定的列进行分组。WITHROLLUP:按照GROUPBY的列对结果集进行汇总,并添加一......