继承机制的两个特性:多态+动态绑定

多态:
     基类的指针或者引用可以指向任何派生类对象的 能力;(一般类型而言不允许,因为C++强类型语言,其他只有静态类型一说,对于指针和引用具有静态类型和动态类型两个方面)
动态绑定:
   
1。 (和虚拟函数永不分家,配合才能实现)
         
派生类存在一个函数,而基类无,则此时未建立虚拟函数机制,即使指针,或引用的动态类型是派生类类型,也并不能调用, 一句话,没有虚拟函数存在,动态类型也就不存在,一切都以静态类型(象普通的类型检查一样)为准
    2。根据指针或者引用所指向的实际对象类型(指针,引用的动态类型),来调用合适的 虚拟成员函数
         (当并非虚拟函数的时候,即使指针的动态类型是派生类,由于并无虚拟机制的支持,此时也不能实现动态绑定,而只能根据当时指针引用的静态类型,调用静态类型的成员函数)

虚拟函数机制未建立,一切以静态类型执行
class B
{
public:
    B(){}
    void ok(){cout << "B::ok()" << endl;}
};

class D1:public B
{
public:
    D1(){}
    void ok(){cout << "D1::ok()" << endl;}
};

int main()
{
    B b;
    B *p = &b;
    p -> ok();
    D1 d1;
    p = &d1;
    p -> ok();
    return 0;
}


成员函数分为:
1。建立虚拟机制的(动态类型存在,进行动态绑定,如ok()函数)
2。未建立虚拟机制的(动态类型此时未建立,一切以静态类型执行,如d1_ok()函数)
class B
{
public:
    B(){}
    virtual void ok(){cout << "B::ok()" << endl;}
};

class D1:public B
{
public:
    D1(){}
    void ok(){cout << "D1::ok()" << endl;}
    void d1_ok(){cout << "D1::d1_ok()" << endl;}
};

int main()
{
    B b;
    B *p = &b;
    p -> ok();
    D1 d1;
    p = &d1;
    p -> ok();
    p -> d1_ok();
    return 0;
}

派生类继承基类的所有成员,私有成员也继承过来了,所以尺寸只大不小,只是并不能直接访问,即使通过派生类的成员函数,同样也不能访问
(可以这么理解:
派生类的成员函数只能访问
1。自己加进来的成员,无所谓什么权限;
2。从基类继承来的非私有成员,而从基类继承来的私有成员,只能通过基类成员函数访问

class B
{
public:
    B(){a = 3;}
    virtual void ok(){cout << "B::ok()" << endl;}
    int get(){return a;}
    virtual void vget(){}
private:
    int a;
};

class D1:public B
{
public:
    D1(){}
    void ok(){cout << "D1::ok()" << endl;}
    void d1_ok(){cout << "D1::d1_ok()" << endl;}
    virtual void vget(){cout << B::get() << endl;}
};

int main()
{
    B b;
    B *p = &b;
    p -> ok();
    D1 d1;
    p = &d1;
    p -> ok();
    cout << p -> get() << endl;
//    p -> d1_ok();
    p -> vget();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个在Java中实现的示例代码: ```java class Computer { private String brand; private String model; public Computer(String brand, String model) { this.brand = brand; this.model = model; } public void displayInfo() { System.out.println("Brand: " + this.brand); System.out.println("Model: " + this.model); } } class Laptop extends Computer { private double weight; public Laptop(String brand, String model, double weight) { super(brand, model); this.weight = weight; } @Override public void displayInfo() { super.displayInfo(); System.out.println("Weight: " + this.weight); } } class Desktop extends Computer { private int monitorSize; public Desktop(String brand, String model, int monitorSize) { super(brand, model); this.monitorSize = monitorSize; } @Override public void displayInfo() { super.displayInfo(); System.out.println("Monitor Size: " + this.monitorSize); } } ``` 在上面的代码中,我们定义了一个 `Computer` 类,它具有 `brand` 和 `model` 两个私有属性,以及一个 `displayInfo` 方法,用于显示计算机的信息。 然后,我们定义了两个子类 `Laptop` 和 `Desktop`,它们继承自 `Computer`。`Laptop` 类增加了一个 `weight` 属性,并重写了 `displayInfo` 方法,以便能够显示出计算机的重量。`Desktop` 类增加了一个 `monitorSize` 属性,并重写了 `displayInfo` 方法,以便能够显示出计算机的显示器尺寸。 这样,我们就可以创建 `Computer`、`Laptop` 和 `Desktop` 类的对象,并使用它们的方法来显示它们的信息了。具体示例如下: ```java Computer computer = new Computer("Dell", "OptiPlex 9020"); computer.displayInfo(); Laptop laptop = new Laptop("Lenovo", "ThinkPad X1 Carbon", 1.13); laptop.displayInfo(); Desktop desktop = new Desktop("HP", "EliteDesk 800 G1", 24); desktop.displayInfo(); ``` 输出结果如下: ``` Brand: Dell Model: OptiPlex 9020 Brand: Lenovo Model: ThinkPad X1 Carbon Weight: 1.13 Brand: HP Model: EliteDesk 800 G1 Monitor Size: 24 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值