編譯時多態
⑴ 編譯時的多態是指針還是對象
編譯時的多態,既不是指針,也不是對象,其實就是一個宏。
如果運行時的多態這樣:
class A
{
virtual int f() = 0;
}
class A1 : public A
{
int f() {return 1;}
}
class A2 : public A
{
int f() {return 2;}
}
那麼編譯時多態相當於這樣寫:
class A
{
#ifdef _THIS_IS_CLASS_A1_
int f() {return 1;}
#elif defined _THIS_IS_CLASS_A2_
int f() {return 2;}
#endif
};
最後,結論:C++和面向對象根本就是變態!
⑵ 關於java的編譯時多態和運行時多態
您想的有點復雜化了,簡單的說吧,您說的運行時的多態是分為可執行文件和非可執行文件,也就是說您的程序打沒打包,而您說的編譯時的多態也分為兩種;1、重載。2、繼承。前者是靜態的多態形式也就是說不可以用於多個類;針對方法,後者是可以在多個類之間使用,要記得只可以子類繼承父類,不可『以下犯上』。就像是java中的類型,一個是private,另一個是public。
⑶ 請問一下Java里編譯時多態和運行時多態的區別,最好舉個例,謝謝
個人看法
多態的概念 父類引用指向子類對象 而實際調用的方法為子類的方法。
編譯時多態 Java里叫重載 嚴格來說不叫多態 運行時多態 有繼承 有重寫 父類引用指向子類對象
例子我看就算了 書上多 的是
⑷ 請問 c++中 模板是 編譯時多態還是運行時多態,或者都不是,求解
是編譯時多態。所有的模板都是在編譯時產生對應的代碼,它沒有面向對象中的虛表,無法實現動態多態。
你仔細想一想,模板在應用時都必須指定確定的類型,而運行多態僅需指定一個基類就OK啦。
⑸ c++中,可將多態性分為編譯時的多態性和()
編譯時的多態性:就是在程序編譯的時候,也就是生成解決方案的時候就決定要實現什麼操作。而運行時的多態性:就是指直到系統運行時,才根據實際情況決定實現何種操作。
⑹ 編譯時的多態性和運行時的多態性在實現方法上有何不同
我不知道你哪本書上看到的,但是,只要不是後綁定就不能稱為多態,前綁定只能稱為代碼重用,比如函數的重載、覆蓋以及一般的類繼承。
多態的關鍵特點就是:在運行時虛基類指針指向派生類對象地址,而將派生類對象地址賦值給基類指針,這就是所謂的後綁定,編譯時綁定稱為前綁定,因此多態另一個特點就是「動態「。換句話說,如果是後綁定,編譯器事先是不知道在運行時指針將指向哪一種派生類的對象,因此基類指針必須是「虛「的,虛基類中不能有任何實現只有定義,此時虛基類的作用就是一個類介面,這樣才能在編譯時「模糊」掉類型匹配原則,基類的作用只是個約定,定義了函數調用格式,而只在運行時才確定指針具體指向哪一個對象。
而所謂編譯時的多態性根本不存在,如果編譯器能確定基類指針指向哪一個派生類對象地址,就不是多態,哪怕你採用重載覆蓋或者繼承,這些編譯器已經可以預知的事情,一旦編譯完成就固定了,運行時無法更改的,比如你不能在不重新編譯的情況下增加一個重載,這就制約了程序運行時的靈活性以及可擴充性。而多態完全可以實現「熱「更新,更多的是便於程序的可擴充性。你完全可以將派生類編譯在DLL中,每當更新程序時,只要替換掉DLL而不用重新編譯全部代碼。
⑺ 1. 編譯時的多態性與運行時的多態性有什麼區別,他們的實現方法有什麼不同
多態從實現的角度可以劃為兩類:編譯時多態和運行時多態。
編譯時的多態性:就是在程序編譯的時候,也就是生成解決方案的時候就決定要實現什麼操作。
運行時的多態性:就是指直到系統運行時,才根據實際情況決定實現何種操作。
1、多態實現形式不同:
編譯時的多態是通過靜態連編來實現的;運行時的多態是用動態連編來實現的。
2、多態性通過方式不同:
編譯時的多態性主要是通過函數重載和運算符重載來實現的;運行時的多態性主要是通過虛函數來實現的。
(7)編譯時多態擴展閱讀:
靜態多態性又稱編譯時的多態性。靜態多態性的函數調用速度快、效率高但缺乏靈活性,在程序運行前就應決定執行的函數和方法。
動態多態性的特點是:不在編譯時確定調用的是哪個函數,而是在程序運行過程中才動態地確定操作所針對的對象。又稱運行時的多態性。動態多態性是通過虛函數(virtual function)實現的。
⑻ 編譯時多態性使用什麼獲得!A重載函數B繼承C虛函數D.B和C
函數重載和模板。就這題來說選A。
繼承和虛函數對應的多態需要在運行的時候才能確定具體對象,所以不屬於編譯時多態。
函數重載是讓一個函數名對應多個函數,編譯器會根據調用時候的特徵確定要調用的函數,不需要再運行時處理。
而模板是讓一個一個類型模板或者函數模板對應多個類型或者函數,編譯器根據對模板實例化是使用的參數生成具體的類和函數,也不是在運行時進行的。
另外注意模板變數不屬於多態范疇。
⑼ 方法重載和方法重構導致了多態 對不對
這是其中的一種多態;
在JAVA中有兩種多態是指:運行時多態和編譯時多態。
對於多個同名方法,如果在編譯時能夠確定執行同名方法中的哪一個,則稱為編譯時多態性.
如果在編譯時不能確定,只能在運行時才能確定執行多個同名方法中的哪一個,則稱為運行時多態性.
所以,一般情況下,重載指的是編譯時多態,重寫是運行時多態;因為重載是在編譯時就知道調用哪個方法;而如果是子類實例調用父類方法,那麼需要運行時才能知道調用什麼方法,故為運行時多態;
補充一下:不知道你寫的重構指的是重載還是調整代碼
⑽ C++語言中編譯時的多態性是通過____ _ ____實現的.空里填什麼呢
function checkName()
{
var flag=true;
var userName = $("#username").val();
if(chkNullOrEmp(userName))
{
$.ajax({
type : 'post',
url : '<%=basePath%>register/checkName.action?r='+Math.random(),
async: false,
data:"userbean.username="+encodeURI(encodeURI($.trim(userName))),
dataType : 'json',
success : function(json)
{
if(json.operFlag=='success')
{
if(json.count>0)
{
usermsg.innerHTML = "<font color='red'>" +"用戶名已存在!"+ "</font>";
flag=false;
}
usermsg.innerHTML = "<font color='green'>" +"恭喜您,用戶名可以使用!"+ "</font>";
}
else
{
alert("操作失敗");
flag=false;
}
},
error : function(error)
{
alert("操作失敗!");
flag=false;
}
});
}
if(flag)
{
return true;
}
else
{
$("#saveBnt").attr("disabled","");
return false;
}
}
function register(){
$("#saveBnt").attr("disabled",true);
if(checkData()&&checkName())
{
var username=$("#username").val();
var name = $("#userForm").find("input[id='username']").val();
var password = $("#userForm").find("input[id='password']").val();
var v_data = "userbean.username="+name+"&userbean.password="+password;
$.ajax({
type : 'post',
url : '<%=basePath%>register/addUser.action?r='+Math.random(),
data : v_data,
dataType : 'json',
async : false,
success : function(data){
if(data.operflag=="success")
{
alert("操作成功");
}
else
{
alert("操作失敗");
}
},
error :function(error) {
alert("操作失敗!");
}
});
}
}
function checkData()
{
var username = $("#userForm").find("input[id='username']").val();
var password = $("#userForm").find("input[id='password']").val();
var repassword = $("#userForm").find("input[id='repassword']").val();
if(!chkNullOrEmp(username))
{
alert("用戶名稱不能為空");
$("#saveBnt").attr("disabled","");
return false;
}
if(!chkNullOrEmp(password))
{
alert("密碼不能為空");
$("#saveBnt").attr("disabled","");
return false;
}
if(repassword!=password)
{
alert("兩次密碼不一致");
$("#saveBnt").attr("disabled","");
return false;
}
return true;
}
/**
*判斷是否為空
*/
function chkNullOrEmp(str)
{
if(str==null)
{
return false;
}
else
{
str = $.trim(str);
if(str.length>0)
{
return true;
}
else
{
return false;
}
}
}