为什么父类无法访问子类成员

时间:2015-12-30 12:40:00

标签: oop system-verilog

如果按照以下代码进行操作

class A;
  int a = 10;
endclass

class B extends A;
  int b = 20;
endclass

program test;
  A a1;
  B b1;
  initial begin
    b1 = new();
    a1 = b1; //child class object is assigned to parent class handle
    $display("Value of variable b is %x", a1.b);
  end
endprogram

然后上面的代码导致错误,"找不到会员' b'在课堂上' A'"& 现在我的观察是,当扩展类对象被分配给基类句柄时,模拟器将检查句柄的类型并检查该类中是否存在变量。由于变量b未在基类中定义,因此会导致错误 所以我想确认我的上述观察结果是正确还是不正确? 如果有人想在我的观察中添加一些东西,我会欢迎,如果它是正确的。

由于

2 个答案:

答案 0 :(得分:2)

你是对的,这是我所知道的OOP语言中的预期行为(我不是特别知道你正在使用的那个,但你的例子很简单)。能够使用子类声明的变量会导致违反polymorphism(或子类型)的面向对象原则。

我将用Java回答你,因为我确信这个语言的语法对于我想要给出的例子。想象一下具有相同声明类型的两个变量:

public A buildA () {
    return new B();
}
public static void main () {
    A a1 = new A();
    A b1 = buildA();
}

多态性原则是a1b1应该实现相同的接口并且无差别地使用。如果我被允许访问变量的成员b,因为编译器无法猜测哪个是基数,哪个是子进程,那么每次访问具体的{{1}时,它都会允许程序在运行时崩溃,删除应该提供的安全网类型。

答案 1 :(得分:1)

我不会在这里使用术语类。它意味着您有两个单独的类对象

您描述的是两个不同的类类型,其中一个类型是从基类型派生/扩展的。然后,您声明两个类变量<?php ini_set('display_errors',1); error_reporting(E_ALL); if(mysqli_connect_errno()) { echo mysqli_connect_error(); } $loggedInUserId = $_SESSION['user_id']; $resu = mysql_query("SELECT pid FROM users WHERE id='$loggedInUserId';"); $ro = mysql_fetch_row($resu); $sql= "SELECT pid, project_name, image, image_type FROM project WHERE pid ='". $row["pid"]. "';"; $result = $mysqli->query($sql); if ($result->num_rows > 0) { while($row = $result->fetch_array()) { //$type= "Content-type:".$row['image_type']; //header ($type); echo "<form action='respodents.php' method='post'><button name='submit' id='projectbutton'> <div> <img src=pic.php?pid=".$row['pid']." width=100px height=100px/>"." <div id='project_name'>".$row['project_name']."</div>"." <input type='hidden' name='pid' value='".$row['pid']."'> <input type='hidden' name='project_name' value='".$row['project_name']."'> </div> </button></form>"; }} mysqli_close($mysqli); ?>a1。这些变量可以将句柄保存到相同类型的类对象,或者对任何类型的对象的句柄扩展变量的类型。但是,编译器不允许引用任何未通过类变量类型定义的变量或成员,而不管类变量当前持有句柄的对象的类型。

OOP使您能够与类变量进行交互,并且可以使用它来处理更复杂的对象,而无需了解对该对象进行了哪些扩展。但是你必须假设该对象可以与类变量的类型相同。编译器也强制执行此操作。如果要与扩展类变量进行交互,则需要使用扩展类变量类型。