1 class A 2 { 3 private: 4 int x; 5 virtual void f(){cout<<"A f"<<endl;} 6 public: 7 A(/* args */){x=1;cout<<"A构造"<<endl;} 8 ~A(){} 9 friend void p(const A& a){cout<<a.x;} 10 }; 11 class B:A{ 12 public: 13 void f() override {cout<<"B f"<<endl;} 14 operator A()const {} 15 }; 16 int main() 17 { 18 B x; 19 system("pause"); 20 return 0; 21 }
并且属性也一致。基类中某静态成员是public,派生类中也是public。如果基类中是private,那么派生类也无法调用该静态成员。
1 /* 基类的静态成员 */ 2 3 #include<iostream> 4 5 using namespace std; 6 7 class base 8 { 9 public: 10 static int num; 11 12 base() 13 { 14 num+=1; 15 } 16 17 ~base() 18 { 19 num-=1; 20 } 21 }; 22 23 // 基类定义的静态成员,被所有派生类共享 24 // 起到计数器的作用,自身还有所有派生类对象的个数 25 // 遵循私有 公有 保护的继承机制 访问不同 26 // 可以通过父类 子类对象访问 还可以通过父类 子类类名访问 27 int base::num = 0;// 类的静态成员 28 29 class basenew : public base 30 { 31 32 }; 33 34 class basenewx : public basenew 35 { 36 37 }; 38 39 40 void main() 41 { 42 basenew *p = new basenew[100]; 43 44 base *p1 = new base[40] 45 46 basenewx *p2 = new basenewx[50]; 47 48 cout << p->num << endl;// 190 49 cout << p1->num << endl;// 190 50 cout << p2->num << endl;// 190 51 52 53 cin.get(); 54 }
1 class A 2 { 3 public: 4 A(/* args */){} 5 virtual void f()final {} 6 virtual ~A(){} 7 }; 8 class B:public A{ 9 public: 10 void f(int x){}//重载(overload) 11 void f(){} //覆盖(override,非法,因为A中的f声明了final) 12 };
如果用派生类对象为一个基类对象初始化或者赋值,只有其中的基类部分会被拷贝/移动/赋值,它的派生类部分会被忽略。
1 class A 2 { 3 private: 4 int x; 5 public: 6 A(/* args */){x=1;cout<<"A构造"<<endl;} 7 virtual ~A(){} 8 }; 9 class B:public A{ 10 11 }; 12 int main() 13 { 14 A x; 15 B y; 16 A* p=&y;//正确,将基类指针指向派生类变量,派生类指针隐式转换为基类指针。 17 B* q=&x;//错误 18 system("pause"); 19 return 0; 20 }
1 class A 2 { 3 public: 4 A(/* args */){} 5 virtual void f(){cout<<"基类的f"<<endl;} 6 virtual ~A(){} 7 }; 8 class B:public A{ 9 public: 10 void f(){cout<<"派生类的f"<<endl;} 11 }; 12 void F(A& p){ 13 p.f(); 14 } 15 int main() 16 { 17 A x; 18 B y; 19 F(x); 20 F(y); 21 system("pause"); 22 return 0; 23 }
原文:https://www.cnblogs.com/FdWzy/p/12374204.html