
我无法根据用户的选择搞清楚如何正确创建对象.
在程序中,我问用户他们想要成为他们的班级 - 骑士或巫师.我输入'1'或'2'代表骑士和巫师.
我做了一个switch语句,在case 1中,我声明了一个对象Knight,对于Wizard也是如此.
我需要在switch语句之外使用这些对象,但我不能.我试图制作一个'默认'对象,制作'玩家播放器'; 但由于Player类具有纯虚函数,我也不能这样做.
我该如何有效地做到这一点?
这是我到目前为止:
int main()
{
std::string plyrName;
int input;
bool foo = false;
std::cout << "What is your name?\n";
std::cin >> plyrName;
std::cin.ignore(1000, '\n');
std::cout << "\nWelcome, " << plyrName << ". What class would you like to be?\n";
std::cout << "1. Knight.\n2. Wizard.\n";
std::cin >> input;
while (input != 1 && input != 2)
{
if (foo == true)
std::cout << "Please enter 1 for Knight and 2 for Wizard.\n";
if …Run Code Online (Sandbox Code Playgroud) C++ 专家兼 D 语言创始人Walter Bright表示:
切片问题很严重,因为它可能导致内存损坏,并且很难保证程序不会受到这种情况的影响。为了从语言中设计它,支持继承的类应该只能通过引用(而不是通过值)访问。D 编程语言具有这个特性。
如果有人通过给出一个 C++ 示例来解释它会更好,其中对象切片问题导致内存损坏?而这个问题用D语言是如何解决的呢?
有谁知道以下编译warning: catching polymorphic type ‘class std::out_of_range’ by value [-Wcatch-value=]警告的含义以及如何纠正它?我从 Stroustrup 的 C++ 4th Edition 字面上复制了这个代码块。谢谢
#include <iostream>
#include <vector>
#include <list>
using std::vector;
using std::list;
using std::cout;
template <typename T>
class Vec : public vector<T> {
public:
using vector<T>::vector; // constructor
T& operator[](int i) { return vector<T>::at(i); }
const T& operator[](int i) const { return vector<T>::at(i); }
};
int main(int argc, char* argv[]) {
vector<int> v0 = {0, 1, 2};
Vec<int> v1 = {0, 1, 2};
cout << …Run Code Online (Sandbox Code Playgroud) 我正在课程中学习c ++,而我们只是在学习虚拟函数
我们有一个任务来创建一个基类:汽车
和3个派生类:
基类有一个name成员变量(带有getter和setter)和一个getDoorSpecs函数,返回默认值
每个子类也都有getDoorSpecs,我们应该将其创建为虚拟函数。
我们提供了一个主要函数作为驱动程序,不允许我们对其进行修改,并且我们必须创建一个单个函数attachDoors(),该函数可以接收每个子类的实例-并使用正确的getDoorSpecs返回值。
我以为我终于正确创建了虚函数-但是当我运行它时,我显然还不明白如何创建attachDoors函数来利用子类的虚函数。我以为,如果我先调用基类,然后再调用该函数,则子类方法将覆盖它,但是虽然可以很好地编译,但是它给我的输出并不正确。
这是我的代码:
#include <iostream>
#include <string>
using namespace std;
class Car
{
public:
string name;
Car() {
name = "Unknown model";}
string getName(){
return name;}
void setName(string iName){
name = iName;}
virtual string getDoorSpecs(){
return "Unknown doors";}
};
class Civic : public Car
{
public:
Civic(){
name = "Civic";}
virtual string getDoorSpecs() override{
return "4 doors";}
};
class Odyssey : public Car
{
public:
Odyssey(){
name = "Odyssey";}
virtual string …Run Code Online (Sandbox Code Playgroud) 我有几个类继承自一个主类。为了简单起见,我过度简化了类定义,使其简短明了。
class Animal {
protected:
string name;
public:
Animal(string name);
virtual string toString() { return "I am an animal"; }
};
Run Code Online (Sandbox Code Playgroud)
class Bird: public Animal {
private:
bool canFly;
public:
Bird(string name, bool canFly = true)
: Animal(name) // call the super class constructor with its parameter
{
this->canFly = canFly;
}
string toString() { return "I am a bird"; }
};
Run Code Online (Sandbox Code Playgroud)
class Insect: public Animal {
private:
int numberOfLegs;
public:
Insect(string name, int numberOfLegs) : …Run Code Online (Sandbox Code Playgroud) child从中派生的对象base
class base
{
public:
virtual int get() const { return 0;}
~virtual base(){}
};
class child : public base
{
public:
virtual int get() const override { return 1; }
};
Run Code Online (Sandbox Code Playgroud)
当加入容器时切成薄片,例如
std::vector<base> bases;
bases.push_back(child());
Run Code Online (Sandbox Code Playgroud)
并且下面的代码返回0
bases.at(0).get();
Run Code Online (Sandbox Code Playgroud)
即使push_back的签名是:
void push_back( const T& value );
void push_back( T && value );
Run Code Online (Sandbox Code Playgroud)
这不应该招致切片的对象.
例如,下面的代码导致bad_cast
dynamic_cast<child &>(bases.at(0))
Run Code Online (Sandbox Code Playgroud)
而与基地的孩子打电话则表现出多态行为
void toto(base const & e)
{
std::cout << e.get() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这意味着对象不再是一个孩子; 切片在哪里?实际发生了什么?
是否有可能设置base或child应对放置在容器中并且对象不会失去其多态性?
这是一个基本原理问题,并且已经知道一个对象被复制了,所以请不要建议指针/ shared_ptr,因为这已在其他地方得到解决.
在对象切片中,当派生类对象复制到基类对象时,派生类的_vptr是否也会像基类的其他成员一样复制到基类的_vptr?如果没有,为什么?
class Base {
public :
virtual void Display() { cout << "In Base" << endl; }
};
class Derived:public Base {
public:
void Display() { cout << "In Derived" << endl; }
};
int main()
{
Derived objD;
Base objB;
objB = objD;
objB.Display();
}
Run Code Online (Sandbox Code Playgroud)
我观察到上述代码片段的以下结果。
Output
In Base
Run Code Online (Sandbox Code Playgroud) 我建立某种工厂方法返回一个DerivedClass为BaseClass下列方式:
BaseClass Factory()
{
return DerivedClass();
}
Run Code Online (Sandbox Code Playgroud)
是的,BaseClass当我调用该方法时,将使用的move构造函数:
BaseClass object = Factory();
Run Code Online (Sandbox Code Playgroud)
由于我无法制作的move构造函数BaseClass virtual,是否有其他方法可以强制采用的move构造函数DerivedClass?
Edit1:其他信息-我已经考虑过指针。但问题是,我想将工厂函数导出到DLL中,并且希望对用户来说尽可能地容易。标准指针可能会导致内存泄漏,另一方面,并不是每个人都对智能指针熟悉。
Edit2:据我了解,真正的问题是:多态性是否也可以按值返回?
答案是否定的。
c++ ×9
inheritance ×3
polymorphism ×2
c++-faq ×1
d ×1
factory ×1
if-statement ×1
move ×1
object ×1
vector ×1
virtual ×1
vptr ×1
vtable ×1