Masalah memberikan penunjuk kelas asas kepada kelas terbitan
曾经蜡笔没有小新
曾经蜡笔没有小新 2017-06-05 11:11:46
0
3
1199

Tetapkan alamat kelas terbitan kepada penuding kelas asas, iaitu, penuding kelas asas merujuk kepada objek kelas terbitan, yang biasanya kita panggil polimorfisme

Tetapi apabila sebaliknya, penukaran jenis paksa diperlukan sebelum ia boleh disusun dengan jayanya,

Muat turun kod terus:

#include<iostream>

usingnamespacestd;

class Base
{
public:
virtual void print()
{
    cout<<"base"<<endl;
}
};

class Derived:public Base
{
public:
void print()
{
cout<<"derived"<<endl;
}
};
int main(void)
{

Base * pb=newB ase();//定义基类指针

Derived * pd=(Derived*)pb;//赋值给派生类指针

pd->print();//调用基类的print输出base

pd->Derived::print();//调用派生类的print输出derived

return 0;
}

Saya ingin bertanya mengapa cetakan kelas asas dipanggil apabila menggunakan pd->print()

Jadi mengapa selepas mengeluarkan maya kelas asas, cetakan kelas terbitan dipanggil

曾经蜡笔没有小新
曾经蜡笔没有小新

membalas semua(3)
滿天的星座

Fungsi maya yang manakah untuk dipanggil ditentukan oleh jadual fungsi maya yang ditunjuk oleh objek Apabila anda baru Base(), fungsi maya dalam jadual fungsi maya yang ditunjuk oleh pb ialah Base penukaran tidak berubah, dan fungsi bukan maya terutamanya berdasarkan jenis penunjuk, yang bermaksud bahawa pd Terbitan dari awal, jadi menggunakan fungsi Terbitan, fungsi ahli sebenarnya memanggil penunjuk ini apabila ia dipanggil.

刘奇

Penentukan maya menentukan bahawa fungsi ahli bukan statik adalah maya dan menyokong pengikatan dinamik Ia mungkin hanya muncul dalam decl-specifier-seq bagi pengisytiharan awal fungsi ahli bukan statik (iaitu, apabila ia diisytiharkan dalam. definisi kelas).

Fungsi maya ialah fungsi ahli yang tingkah lakunya boleh ditindih dalam kelas terbitan.

Menggunakan maya bermakna fungsi ini boleh ditindih oleh subkelas, supaya penunjuk kelas induk yang menunjuk ke subkelas tidak memanggil fungsi ini mengikut kategori penunjuk itu sendiri, dan (dengan menyemak jadual fungsi maya V-Table) fungsi selepas ditindih oleh subkelas dipanggil fungsi.
Memang patut disebut

Base * pb=new Base();//定义基类指针
Derived * pd=(Derived*)pb;//赋值给派生类指针

Menulis seperti ini tidak betul, atau sekurang-kurangnya ia tidak selamat Penunjuk kelas induk yang menunjuk ke objek kelas induk tidak boleh diberikan kepada penuding subkelas.

Pd->cetakan di sini menunjukkan cetakan kelas induk dalam jadual fungsi maya, jadi

pd->print();                    //调用父类的print,输出base

Panggilan ialah Base::print

Seterusnya

pd->Derived::print();

Ini adalah untuk memanggil secara paksa fungsi subkelas pada objek kelas induk (atau gunakan objek kelas induk sebagai ini dan secara paksa memanggil cetakan subkelas dalam jadual fungsi maya Ini biasanya tidak disyorkan).

伊谢尔伦

Ini benar-benar berlaku. Saya baru sahaja menjalankannya dan ia benar-benar sukar untuk difahami.

Biar saya beritahu anda pemikiran saya, saya tidak tahu sama ada anda boleh merujuknya:

.

Dalam kes pertama, maya ditulis Jika maya ditambahkan pada fungsi ahli, ia bermakna ia terikat secara dinamik Alamat fungsi yang dipanggil hanya akan ditemui semasa pelaksanaan. Tetapi di mana untuk mencarinya? Nampaknya terdapat jadual maya dalam ingatan setiap objek (ia juga dikatakan bahawa setiap kelas mempunyai jadual maya, yang dikongsi oleh objek Kerana penunjuk Terbitan anda menghala ke memori objek Base, sistem berjalan). ke blok itu Cari fungsi cetakan dalam jadual maya memori Alamat fungsi cetakan dalam jadual maya memori ialah alamat fungsi cetakan kelas Asas, jadi fungsi cetakan kelas asas ialah. dipanggil

Kes kedua: jika maya digunakan, maka pengikatan dinamik tidak terlibat, dan alamat fungsi ditentukan semasa penyusunan. Bagaimana untuk menentukan alamat fungsi semasa penyusunan: ia diperoleh dengan mencari dalam jadual simbol program sumber. Kemudian pd->print() dalam program utama Jelas sekali, pd ialah kelas Derived, dan pd->print() adalah bersamaan dengan Derived::print Kemudian pengkompil akan mencarinya dalam kelas Derived pd digunakan semasa penyusunan ->Alamat print() dalam print() digantikan dengan alamat Derived::print, jadi fungsi cetakan subkelas dipanggil.

Saya tidak tahu sama ada anda faham apa yang saya katakan

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan