C++虚函数解析问题
C++ virtual function resolution issue
程序在此函数调用解析中抛出错误:
for(vector<Catalog*>::iterator i=m_subDeptList.begin(); i!=m_subDeptList.end(); ++i)
(*i)->displayDiscription();
错误:
test.cpp: In member function ‘void Department::displayDiscription()’:
test.cpp:73:14: error: ‘class Catalog’ has no member named ‘displayDiscription’
(*i)->displayDiscription();
但以下呼叫解决方案没有问题:
for(vector<Product*>::iterator i=m_products.begin(); i!=m_products.end(); ++i)
(*i)->displayDiscription();
for(vector<Catalog*>::iterator i=m_subDeptList.begin() ; i!=m_subDeptList.end(); ++i)
(*i)->addDiscount(discount);
for(vector<Product*>::iterator i=m_products.begin(); i!=m_products.end(); ++i)
(*i)->addDiscount(discount);
有人能解释一下吗?
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
class Catalog
{
string m_name;
public:
Catalog(const string &name):m_name(name){}
//virtual ~Catalog(){}
const string& getName()
{
return m_name;
}
virtual bool addDiscount(unsigned int discount)=0;
virtual void displayDescription()=0;
};
class Product:public Catalog
{
unsigned short m_discount; // discount in %
long double m_price;
public:
Product(const string& productName, const long double &price):Catalog(productName),m_price(price){}
void displayDiscription()
{
cout<<getName()<<"price: "<<getPrice()<<endl;
}
bool addDiscount(const unsigned int discount)
{
if( discount > 100 || discount < 0)
return false;
m_discount+=discount;
return true;
}
long double getPrice()
{
return m_price;
}
};
class Department:public Catalog
{
vector<Product*> m_products;
vector<Catalog*> m_subDeptList;
unsigned int discountApplied;
public:
Department(const string &name):Catalog(name){}
bool addDiscount(unsigned int discount) // add discount to all products in this dept/subDept
{
if( discount > 100 || discount < 0)
return false;
for(vector<Catalog*>::iterator i=m_subDeptList.begin() ; i!=m_subDeptList.end(); ++i)
(*i)->addDiscount(discount);
for(vector<Product*>::iterator i=m_products.begin(); i!=m_products.end(); ++i)
(*i)->addDiscount(discount);
discountApplied+=discount;
return true;
}
void displayDiscription()
{
cout<<getName()<<endl;
if(!m_subDeptList.empty() )
for(vector<Catalog*>::iterator i=m_subDeptList.begin(); i!=m_subDeptList.end(); ++i)
(*i)->displayDiscription();
if(!m_products.empty() )
for(vector<Product*>::iterator i=m_products.begin(); i!=m_products.end(); ++i)
(*i)->displayDiscription();
return;
}
/*
void addProduct(Product* pProduct)
{
m_products.push_back(pProduct);
}
void addDepartment(Catalog* pDepartment)
{
m_subDeptList.push_back(pDepartment);
}
*/
};
int main(int argc, char** argv) {
/*
Department megaStoreCatalog("catalog");
Department stationary("Stationary");
Product pen("pen", 5);
stationary.addProduct(&pen);
Department stationaryLiquid("Stationary-Liquid");
Product ink("Bril",30);
stationaryLiquid.addProduct(&ink);
megaStoreCatalog.addDepartment(&stationary);
stationary.addDepartment(&stationaryLiquid);
megaStoreCatalog.addDiscount(10);
*/
return 0;
}
您不能只在 addDiscount
中添加 const
。它改变了函数签名。
您应该使用 C++11 override
keyword。
无法解析,因为在该纯虚函数声明的基础 class 签名中找不到您的两个派生 classes 方法。您的问题不是实现问题,而是拼写错误。
查看您在 Base 和 Derived classes 中的拼写;您将一个拼写为 discription
,将另一个拼写为 description
。此外,您还拥有一种带有 const
的纯虚方法,但在基础 class 中未以这种方式定义。另一件事是您的构造函数只有 1 个参数,因此您应该在其名称前使用 explicit
关键字声明该构造函数。您不应该在基类中使用默认构造函数,即使它是空的或什么都不做并将其声明为虚拟的。
在你的基地Class
virtual void displayDescription()=0;
在你的派生 Classes
void displayDiscription()
{
cout<<getName()<<"price: "<<getPrice()<<endl;
}
&
void displayDiscription()
{
cout<<getName()<<endl;
if(!m_subDeptList.empty() )
for(vector<Catalog*>::iterator i=m_subDeptList.begin(); i!=m_subDeptList.end(); ++i)
(*i)->displayDiscription();
if(!m_products.empty() )
for(vector<Product*>::iterator i=m_products.begin(); i!=m_products.end(); ++i)
(*i)->displayDiscription();
return;
}
程序在此函数调用解析中抛出错误:
for(vector<Catalog*>::iterator i=m_subDeptList.begin(); i!=m_subDeptList.end(); ++i)
(*i)->displayDiscription();
错误:
test.cpp: In member function ‘void Department::displayDiscription()’:
test.cpp:73:14: error: ‘class Catalog’ has no member named ‘displayDiscription’
(*i)->displayDiscription();
但以下呼叫解决方案没有问题:
for(vector<Product*>::iterator i=m_products.begin(); i!=m_products.end(); ++i)
(*i)->displayDiscription();
for(vector<Catalog*>::iterator i=m_subDeptList.begin() ; i!=m_subDeptList.end(); ++i)
(*i)->addDiscount(discount);
for(vector<Product*>::iterator i=m_products.begin(); i!=m_products.end(); ++i)
(*i)->addDiscount(discount);
有人能解释一下吗?
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
class Catalog
{
string m_name;
public:
Catalog(const string &name):m_name(name){}
//virtual ~Catalog(){}
const string& getName()
{
return m_name;
}
virtual bool addDiscount(unsigned int discount)=0;
virtual void displayDescription()=0;
};
class Product:public Catalog
{
unsigned short m_discount; // discount in %
long double m_price;
public:
Product(const string& productName, const long double &price):Catalog(productName),m_price(price){}
void displayDiscription()
{
cout<<getName()<<"price: "<<getPrice()<<endl;
}
bool addDiscount(const unsigned int discount)
{
if( discount > 100 || discount < 0)
return false;
m_discount+=discount;
return true;
}
long double getPrice()
{
return m_price;
}
};
class Department:public Catalog
{
vector<Product*> m_products;
vector<Catalog*> m_subDeptList;
unsigned int discountApplied;
public:
Department(const string &name):Catalog(name){}
bool addDiscount(unsigned int discount) // add discount to all products in this dept/subDept
{
if( discount > 100 || discount < 0)
return false;
for(vector<Catalog*>::iterator i=m_subDeptList.begin() ; i!=m_subDeptList.end(); ++i)
(*i)->addDiscount(discount);
for(vector<Product*>::iterator i=m_products.begin(); i!=m_products.end(); ++i)
(*i)->addDiscount(discount);
discountApplied+=discount;
return true;
}
void displayDiscription()
{
cout<<getName()<<endl;
if(!m_subDeptList.empty() )
for(vector<Catalog*>::iterator i=m_subDeptList.begin(); i!=m_subDeptList.end(); ++i)
(*i)->displayDiscription();
if(!m_products.empty() )
for(vector<Product*>::iterator i=m_products.begin(); i!=m_products.end(); ++i)
(*i)->displayDiscription();
return;
}
/*
void addProduct(Product* pProduct)
{
m_products.push_back(pProduct);
}
void addDepartment(Catalog* pDepartment)
{
m_subDeptList.push_back(pDepartment);
}
*/
};
int main(int argc, char** argv) {
/*
Department megaStoreCatalog("catalog");
Department stationary("Stationary");
Product pen("pen", 5);
stationary.addProduct(&pen);
Department stationaryLiquid("Stationary-Liquid");
Product ink("Bril",30);
stationaryLiquid.addProduct(&ink);
megaStoreCatalog.addDepartment(&stationary);
stationary.addDepartment(&stationaryLiquid);
megaStoreCatalog.addDiscount(10);
*/
return 0;
}
您不能只在 addDiscount
中添加 const
。它改变了函数签名。
您应该使用 C++11 override
keyword。
无法解析,因为在该纯虚函数声明的基础 class 签名中找不到您的两个派生 classes 方法。您的问题不是实现问题,而是拼写错误。
查看您在 Base 和 Derived classes 中的拼写;您将一个拼写为 discription
,将另一个拼写为 description
。此外,您还拥有一种带有 const
的纯虚方法,但在基础 class 中未以这种方式定义。另一件事是您的构造函数只有 1 个参数,因此您应该在其名称前使用 explicit
关键字声明该构造函数。您不应该在基类中使用默认构造函数,即使它是空的或什么都不做并将其声明为虚拟的。
在你的基地Class
virtual void displayDescription()=0;
在你的派生 Classes
void displayDiscription()
{
cout<<getName()<<"price: "<<getPrice()<<endl;
}
&
void displayDiscription()
{
cout<<getName()<<endl;
if(!m_subDeptList.empty() )
for(vector<Catalog*>::iterator i=m_subDeptList.begin(); i!=m_subDeptList.end(); ++i)
(*i)->displayDiscription();
if(!m_products.empty() )
for(vector<Product*>::iterator i=m_products.begin(); i!=m_products.end(); ++i)
(*i)->displayDiscription();
return;
}