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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C++父类与子类之间变量的问题相关的知识,希望对你有一定的参考价值。

假如父类有两个变量,父类有两个子类继承这两个变量,现在我想让这两个子类中继承的变量变为静态的该怎么办呢,而且在这两个子类在继承父类变量时赋值的都不一样

参考技术A 不可以改变继承的变量的控制权限,从静态变成局部,从局部变成静态,即使是public和protected,也只能从高到低。 参考技术B #include<stdio.h>
class father

public:
int a,b;
;

class sn1 :public father

public:
static int a;
static int b;
;

int sn1::a = 10;
class sn2 :public father

public:
static int a;
static int b;

;
int main()
sn1 m_sn1; printf("[%d] \n",m_sn1.a);

return 0;

输出:[10]
你可以试一下。本回答被提问者和网友采纳

SV中父类与子类句柄转换,即子类的扩展类与父类句柄转换等问题


如上图,表示了父类与子类的继承关系以及对象关系。

因此假设B继承A,那么子类B所能访问的成员变量同时包括自己的成员和父类的所有成员变量,也就是图中的大三角;而父类A仅能访问自己以及子类中属于自己的成员变量,不可访问子类的成员变量,即图中的小三角这是编译器规定,同时这个业与C/C++等高级语言保持一致。

那么就有一个问题,实际写代码过程中,避免不了类型的转换问题,父类和子类句柄之间该如何转换?

根据图中的包含与被包含关系,我们可以清楚看到,子类包含了父类,因此:

父类句柄=子类句柄,顺理成章,但反过来就不行。

为什么?因为子类包含了父类成员变量,那么把子类句柄赋值给父类,父类按照编译器规定就可以仅访问子类中的属于自己的成员变量,如果强行把父类句柄用=赋值给子类,那么子类句柄就访问不到自己的成员变量,因为父类句柄仅可以访问属于自己的成员变量,那么问题来了,把子类句柄转换成父类后怎么转回来?sv中提供一种方法:$cast(子类,父类)前提是先有 父类句柄=子类句柄 ,必须保证父类句柄指向的是子类对象才可以使用cast。此时也有个问题:

$cast(父类,子类)行不行? 答案是:当然可以,这个等同于父类句柄=子类句柄

那么接下来还有一个问题:
子类的扩展类句柄赋值给其父类行不行?等同于孙子的句柄赋值给爷爷, 答案是:当然可以,因为爸爸从爷爷哪里学会了所有技能,并且自创了技能,而孙子不仅从哪里又学会了爸爸所有会的技能,也自己创新了一些技能,会的更多了,就像最开始那个三角,子类集成类所包含成员变量是一个包含了子类及父类更大的三角形。

因此,就会有一道题:
B集成A,C集成B,那么A=C,"$ cast(B,A)合不合法?答案是合法
总结起来就是:
1、$cast(father,son)作用等于father=son;

2、father没有引用过子类(son)句柄:$cast(son,father)返回值为0,cast失败

3、father=son1(son的扩展类son1);$cast(son,father)返回值为1,cast成功

接下来我们看一段代码:

`include "param_def.v"

 module test;
class A;

  string name;
  function new(string name="A");
   this.name=name;
  endfunction
endclass;
class B extends A;

endclass;
class C extends B;
 
endclass;

  A a=new();
  B b=new();
  C c=new();
initial begin
 a=b;
 $cast(b,a);
 a=c;
 $cast(b,a);
end;
endmodule

  


上例中:均是合法操作

以上是关于关于C++父类与子类之间变量的问题的主要内容,如果未能解决你的问题,请参考以下文章

类多态的向上转型,父类的方法被子类重写

SV中父类与子类句柄转换,即子类的扩展类与父类句柄转换等问题

SV中父类与子类句柄转换,即子类的扩展类与父类句柄转换等问题

SV中父类与子类句柄转换,即子类的扩展类与父类句柄转换等问题

JavaSE8基础 当父类与子类中的成员变量重名了,使用super.名字 来访问父类的成员变量

总结C++基类与派生类的赋值兼容规则