CPP/类/成员函数访问权限2

时间:2023-03-09 19:55:15
CPP/类/成员函数访问权限2
//  main.cpp
// OOL
// Created by mac on 2019/4/4.
// Copyright © 2019年 mac. All rights reserved.
// 1.在一个类中如果直接把成员函数权限声明成protected或者是private是无法直接被生成的本类对象访问的.
// 2.如果想要访问被protected或者private保护的函数,那么可以在本类的public修饰符下生成新函数,调用那两种函数就可以了。
// 3.BaseClass称为基类或者超类 Derived1成为子类或派生类
// 4.类class的前面是否需要添加访问修饰符,对类本身,对类生成的对象,对继承类,对成员函数,对成员变量都有什么影响
// 5.从基类中的protected权限下继承的g()函数,可以在子类中在public权限下进行g()重写。
// 6.从基类中private权限下继承的h()函数,可以在子类中的public权限下进行h()函数的重写。
// 7.在生成继承类的时候 public virtual 继承是什么意思?
// 8.在生成继承类的时候,子类的public修饰符下的成员函数可以调用基类的protected修饰符下的函数,但是无法调用继承来的privated修饰符下的函数
// 9.在生成派生类的时候 如果是以protected的形式来进行继承的话,那么基类的所有公有、受保护成员在派生类中都会变成受保护的成员。
// 10.对于私有形式的继承,基类的公有成员和受保护的成员在派生类中都变成了私有成员。
// 11.在所有的继承类型中,基类的私有成员都不能在派生类中访问。
// 12.基类的受保护成员只能在派生类中访问,而不能在非派生类中进行访问。这个非派生类除了指类这种东西本身外,还指其他的东西。我觉得这样说还不是很完整,因为基类的受保护成员,在基类定义的内部也是可以被调用的。而非单指的是派生类。
// 13.类的前面添加virtual是为了继承类防止冗余的现象。但是具体的用法还是不清楚。
#include <iostream>
using namespace std;
class BaseClass{
public:
BaseClass(){ }
void f(){
cout<<"f()in BaseClass"<<endl;
}
//1.在基类中重新定义函数进行调用,从而打破访问修饰符的限制。
//2.或者在子类中的public修饰符下重写这个函数。
void c(){
g();
h();
}
protected:
void g(){
cout<<"g()in BaseClass"<<endl;
}
private:
void h(){
cout<<"h()in BaseClass"<<endl;
}
};
//继承基类
class Derived1 : public virtual BaseClass{
public:
//在继承类中重写f()函数
void f(){
g();
//h();
} protected:
private: };
int main(int argc, const char * argv[]) {
BaseClass bc;
bc.c();
Derived1 d1;
//d1.g();
//d1.h();
d1.f();//输出的是继承类的f()函数
d1.BaseClass::f();//输出的基类的f()函数
return 0;
}

Tips

  • 类class的构造函数的前面必须添加public,要不没法生成对象。不加public,默认就是private。
  • 注意结构体struct的构造函数前面不加public,也能正常生成对象。
  • 每个对象都可以通过指针this来访问自己的地址,所以*this就是指的对象本身。
  • 在写析构函数的时候注意区分~的英文或者中文状态,否则编译无法通过。