关于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中父类与子类句柄转换,即子类的扩展类与父类句柄转换等问题