#include "StdAfx.h"
#include <vector>
#include <iostream>
#include<iostream>
using namespace std;
#if 1
class A
{
public:
void foo()
{
printf("1\n");
}
virtual void fun()
{
printf("2\n");
}
};
class B : public A
{
public:
void foo()
{
printf("3\n");
}
void fun()
{
printf("4\n");
}
};
int main(void)
{
A a;
B b;
B *ptr = NULL;
ptr = (B *)&a;
ptr->foo();
ptr->fun();
getchar();
return 0;
}
有如上程式,運行結果為
3
2
不太理解為什么會有這樣的結果,求大神解釋
uj5u.com熱心網友回復:
很神奇啊,竟然有人這么用多型。正確方法是:
A* ptr = &B;
p->fun();
uj5u.com熱心網友回復:
你的使用方法是危險的。可以把子類物件當父類物件使,不要把父類物件當子類物件使。uj5u.com熱心網友回復:
我知道正確的使用方法是A* ptr = &B;
p->fun();
現在只是想知道為何會有這樣的結果
為何
B *ptr = (B *)&a; ptr->foo呼叫到的是派生類的方法,而ptr->fun()呼叫到的卻是基類的方法
uj5u.com熱心網友回復:
foo是非虛函式,根據指標型別編譯時即確定呼叫B::foo;
fun是虛函式,根據指標指向物件來確定呼叫哪個函式;
沒有你這么用的,閣下思維與眾不同。
uj5u.com熱心網友回復:
我大概是這么理解的函式指標獨立于物件
所以即使
B *ptr = NULL;
ptr ->foo() ; //只要不用到類成員變數,就沒有問題
但是
ptr = (B *)&a;//父類A的虛函式表還是原本a實體中的
所以呼叫的是A中的fun();
不過這樣做太危險了,LZ還是不要這么寫吧
uj5u.com熱心網友回復:
父類定義了虛函式virtual void fun() ;
子類的同名函式
void fun() ;也是虛函式來的,不管有沒有virtual 關鍵字。
注意一下C++游戲規則。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/119898.html
標籤:基礎類
下一篇:類模板特化與片特化問題
