C++可不可以让子类继承父类的静态成员后赋予它各自不同的值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++可不可以让子类继承父类的静态成员后赋予它各自不同的值?相关的知识,希望对你有一定的参考价值。

我们知道,假如一个类有一个静态成员:
class Base
public:
static int m_Num;
//...
;
有两个子类:
class Derived1
//...
;
class Derived2
//...
;
那么这两个类中的m_Num成员指向的都是同一个,也就是说如果已经有:
int Derived1::m_Num = 1;
这一句定义的话,再定义:
int Derived2::m_Num = 3;
就是错误的。
我想知道有没有这样的方法,使得不同的子类能够有不同的静态成员实例。换句话说,我想通过在基类中声明一个静态成员使得它的所有子类都有一个静态成员,但这个成员对于不同的类是不同的。这可以实现吗?

不行,这是静态成员的规则.因为没有this指针所以可以被这个类中的任何对象实例所引用

除非把这个静态成员改为动态才可实现功能。
可以在各个子类中定义它们自己的静态成员,然后给它们不同的值。如下:
#include<iostream>
using namespace std;

class Base

public:
static int m_Num;
//...
;

class Derived1:public Base

static int m_Num;
//...
;
class Derived2:public Base

static int m_Num;
//...
;

int Derived1::m_Num = 1;
int Derived2::m_Num = 3;

int main()

return 0;
参考技术A 不行,这是静态成员的规则.因为没有this指针所以可以被这个类中的任何对象实例所引用.

除非你把这个静态成员改为动态才可实现你的功能.
参考技术B 不行。

你可以在各个子类中定义它们自己的静态成员,然后给它们不同的值。如下:
#include<iostream>
using namespace std;

class Base

public:
static int m_Num;
//...
;

class Derived1:public Base

static int m_Num;
//...
;
class Derived2:public Base

static int m_Num;
//...
;

int Derived1::m_Num = 1;
int Derived2::m_Num = 3;

int main()

return 0;
参考技术C int Derived1::m_Num = 1;
这样写本来就是不对的。不能去重定义基类的数据成员。
事实上基类的静态成员永远只有一份。
如果想要那么做,只能是非静态的。
要么就是两个派生类里都有一个同名静态成员。
当然,这在强制为基类指针时无法访问(像楼上那位那样。

还有一个绝招:
class B
public:
virtual int Num()=0;
;
class A1
public:
static int num;
virtual int Num()
return num;

;
int A1::num=0;

class A2
public:
static int num;
virtual int Num()
return num;

;
int A2::num=1;

int main()

A1 a1;
A2 a2;
B *b1=&a1,*b2=&a2;
cout<<b1->Num()<<b2->Num()<<endl;
return 0;
本回答被提问者和网友采纳
参考技术D 静态成员有他自己的用途,哪有这样用的啊

C++ 中,类的继承:父类当使用虚函数时候,子类对该函数进行重写的话,属于子类成员函数对虚函数的覆盖!

请问这里的覆盖是什么意思?是不是说子类对象中没有继承父类的虚函数?或者说是继承来了之后,被覆盖了,也就是彻底没了,这样理解可以吗

可以这么理解。
换句话说,你调用子类的虚函数,程序会运行你重写的代码,而不是定义在父类里的代码。追问

但是我子类里面不是虚函数,只是普通的成员函数

追答

没事,只要父类里是虚函数,子类里的同名函数都是虚函数,即使你没写virtual。

追问

我一直以为覆盖就是子类对象中没有了父类的成员函数,假设父类是A,子类的对象是bb,那么我采用aa.A::fun(),是可以运行父类的成员函数的呀,这不就和刚才的那个理解相悖了嘛 怎么解释

追答

因为父类的成员函数还是存在的啊。我不知道你说的对象中有函数是什么意思,函数的代码并不是储存在对象中,对象查找虚函数是通过虚函数表来找到相应函数的地址来实现调用的,而你所说的aa.A::fun()则是跳过了虚函数表直接找到A类fun()函数的地址来调用它。

参考技术A 有没有代码,你这样我也看不懂!追问

追答

子类的virtual可以省略!是有虚函数的!

以上是关于C++可不可以让子类继承父类的静态成员后赋予它各自不同的值?的主要内容,如果未能解决你的问题,请参考以下文章

关于C++父类与子类之间变量的问题

简述在类的继承关系中,子类可以继承父类的都有哪些成员

C++中子类从基类都继承啥?

C++三大特性---继承

C++三大特性---继承

C++调用父类的构造函数规则