纯虚函数和虚函数有什么区别?
我知道"纯虚函数是一个没有正文的虚函数",但这意味着什么,以及下面这一行实际完成的内容:
virtual void virtualfunctioname() = 0
Run Code Online (Sandbox Code Playgroud) 让我们假设Visual C++ 2010中的这种情况:
#include <iostream>
#include <conio.h>
using namespace std;
class Base
{
public:
int b;
void Display()
{
cout<<"Base: Non-virtual display."<<endl;
};
virtual void vDisplay()
{
cout<<"Base: Virtual display."<<endl;
};
};
class Derived : public Base
{
public:
int d;
void Display()
{
cout<<"Derived: Non-virtual display."<<endl;
};
virtual void vDisplay()
{
cout<<"Derived: Virtual display."<<endl;
};
};
int main()
{
Base ba;
Derived de;
ba.Display();
ba.vDisplay();
de.Display();
de.vDisplay();
_getch();
return 0;
};
Run Code Online (Sandbox Code Playgroud)
从理论上讲,这个小应用程序的输出应该是:
因为Base类的Display方法不是虚方法,所以Derived类不能覆盖它.对?
问题是,当我运行应用程序时,它会打印出:
重写方法时关键字virtual会做什么?我没有使用它,一切正常.
在这方面,每个编译器的行为是否相同?
我应该使用它吗?
我现在正在学习C++,OO方面,我总是这样做:
class SomeClass{
virtual void aMethod()=0;
}
class AnotherClass{
void anotherMethod(){/*Empty*/}
}
class SomeClassSon : public SomeClass{
void aMethod(){/*Also Empty*/}
}
Run Code Online (Sandbox Code Playgroud)
我的疑问是:3种方法之间有什么区别.虚拟等于零,空虚,虚拟,因为它是继承的,空的.
为什么我不能像父亲一样制作SomeClassSon方法?(虚拟空白等于零?)
可能重复:
为什么纯虚函数初始化为0?
在C++中,将函数声明设置为零意味着什么?我猜它与虚函数有关,而不是在这个类中实际定义的.在我正在阅读的代码头文件中找到:
virtual void SetValue(double val)=0;
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
我只是偶然发现了一个override说明符的用例,据我所知,它似乎是多余的,也没有任何特定的语义含义,但也许我错过了一些东西,因此这个问题.在继续之前,我应该指出,我试图在这里找到答案,但最接近我得到的是以下主题,而不是真正回答我的问题(也许有人可以指出一个问答实际上已经回答了我的问题)题).
考虑以下抽象类:
struct Abstract {
virtual ~Abstract() {};
virtual void foo() = 0;
};
Run Code Online (Sandbox Code Playgroud)
在直接派生的非抽象类中override实现时foo(),有没有理由使用说明符Abstract(DerivedB如下所示)?即,当foo()派生类已经需要实现非抽象(并没有真正覆盖任何东西)时?
/* "common" derived class implementation, in my personal experience
(include virtual keyword for semantics) */
struct DerivedA : public Abstract {
virtual void foo() { std::cout << "A foo" << std::endl; }
};
/* is there any reason for having the override specifier here? */
struct DerivedB : …Run Code Online (Sandbox Code Playgroud) 可能重复:
C++ Virtual/Pure Virtual Explained
c ++中虚函数实例化的区别
为什么纯虚函数初始化为0?
这是有人给我的一些类声明中的方法.我不知道'.. = 0'是什么意思.它是什么?
virtual void Print() const = 0;
Run Code Online (Sandbox Code Playgroud) 我正在创建一个名为Asset的简单抽象类,标题代码如下所示:
#ifndef ASSET_H
#define ASSET_H
#include <QString>
#include <QDate>
class Asset
{
public:
Asset(QString des, QDate dat);
~Asset();
virtual QString toString();
virtual double value();
QString getDescription();
private:
QString description;
protected:
QDate date;
};
#endif // ASSET_H
Run Code Online (Sandbox Code Playgroud)
这是我的实现文件的样子:
#include "asset.h"
Asset::Asset(QString des, QDate dat)
{
description = des;
date = dat;
}
QString Asset::getDescription()
{
return description;
}
Run Code Online (Sandbox Code Playgroud)
我在实现构造函数上得到的错误代码是: undefined reference to vtable for Asset
我在这做错了什么?
我有一个抽象的基类.我从抽象基础继承了一个新类,我无法实例化一个对象.编译器告诉的原因是
cannot allocate an object of abstract type
有没有办法克服这个问题.
我按照上一篇文章中的说明重新编写了代码.
我的头文件
#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <typeinfo>
#include "Tour.h"
#include "GuidedTour.h"
using namespace std;
class TourManager {
private:
vector<Tour *> tours;
void setupTour();
string getUserInput();
string displayMainMenu();
void displayTourDetails();
void callDisplayOnEach();
void addBookingsToTour();
public:
TourManager();
void go();
};
Run Code Online (Sandbox Code Playgroud)
然后我有一个函数用tour和guidedTour对象填充"list"向量.
void TourManager::setupTour() {
tours.push_back(new Tour("FP001", "Fun Park 3 Day Pass", 110.00));
tours.push_back(new GuidedTour("SK003", "Learn to Ski Adventure Tour", 240.00, "28/07
}
void TourManager::callDisplayOnEach() {
for (vector<Tour *>::iterator it = tours.begin() ; it != tours.end(); ++it)
{ …Run Code Online (Sandbox Code Playgroud) 我有两个班级:
class Object {
public: void Update();
};
class Cube : public Object {
void Update();
};
Run Code Online (Sandbox Code Playgroud)
我想要一个 Update() 方法来完成我告诉它的所有事情,然后完成来自父类的 Update 所做的所有事情。我可以这样做吗?
#include <iostream>
#include <string>
using namespace std;
class Part{
public:
std::string spec;
Part(std::string str){
this->spec = str;
}
std::string getSpec(){
return spec;
}
};
class Car{
public:
Part getEngine();
Part getWheels();
Part getBody();
};
class Benz:public Car{
public:
Part getEngine(){
return Part("Benz Engine");
}
Part getWheels(){
return Part("Benz Wheels");
}
Part getBody(){
return Part("Benz Body");
}
};
class Audi:public Car{
public:
Part getEngine(){
return Part("Audi Engine");
}
Part getWheels(){
return Part("Audi Wheels");
}
Part getBody(){
return Part("Audi Body");
}
}; …Run Code Online (Sandbox Code Playgroud) 当我看到虚拟虚空enter()= 0时,我正在读书。赋值不是变量时该怎么办?
class MapSite {
public:
virtual void Enter() = 0;
};
Run Code Online (Sandbox Code Playgroud) c++ ×12
class ×3
oop ×3
pure-virtual ×2
c# ×1
c++98 ×1
constructor ×1
function ×1
inheritance ×1
methods ×1
overriding ×1
parent-child ×1
qt5 ×1
types ×1
void ×1